我正在尝试解析来自 SOAP Web 服务的响应,但部分数据包含无效的 xmlns 元素,我认为这给我带来了无穷无尽的麻烦。
我正在使用的 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 中是无效的,它指向一个不存在的文档。应该注意的是,网络服务不在我的控制之下,所以修复这个问题是不可能的:(。
目前,我的 Delphi (2007) 代码看起来像这样。
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','')
(
我怀疑这是由于缺少命名空间,所以我试图删除它,但收到更多错误,说它是一个只读属性。
不管有没有 NS,是否有删除 xmlns 属性或选择节点?还是我要解决这个问题?