我正在使用的XML部分如下所示。
<soap:Body xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<ResponseData xmlns="http://www.example.com/WebServices/Schemas/1">
<ResponseDataResult>
<Messages xmlns="http://www.example.com/WebServices/Schemas/2">
<Message>...</Message>
</Messages>
</ResponseDataResult>
...
</ResponseData>
</soap:Body>
soap:Body节点中的xmlns URI正常,ResponseData中的那个无效,它指向一个不存在的文档。应该注意的是,web服务不在我的控制之下,因此修复它是不可能的:(。
var l_tmp,l_tmp2,FSOAPBody:IXMLNode;
begin
...
FSOAPBody := FSOAPEnvelope.ChildNodes.FindNode('Body','http://schemas.xmlsoap.org/soap/envelope/');
//returns the xml above.
if (FSOAPBody = nil) then exit;
l_tmp := FSOAPBody.ChildNodes.FindNode('ResponseData','');
if (l_tmp = nil) or (not l_tmp.HasChildNodes) then exit;
l_tmp2 := l_tmp.ChildNodes.FindNode('ResponseDataResult','');
...
end;
在上面的代码中,我不得不将空白命名空间URL添加到
FindNode('ResponseData','')
如果没有它,它将找不到任何东西并返回nil,但是它会重新生成预期的XML。
问题是下一个查找节点(
ChildNodes.FindNode('ResponseDataResult','')
)在尝试访问l_tmp的子节点时引发访问冲突,我可以使用l_tmp.xml查看xml,并确定它是我期望的xml。