【问题标题】:Delphi - Invalid namespace URI in IXMLNodeDelphi - IXMLNode 中的命名空间 URI 无效
【发布时间】:2009-05-06 08:48:10
【问题描述】:

我正在尝试解析来自 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','')) 在尝试访问 l_tmp 的 ChildNodes 时引发访问冲突,我可以使用 l_tmp.xml 查看 xml,发现它是我期望的 XML。

我怀疑这是由于缺少命名空间,所以我试图删除它,但收到更多错误,说它是只读属性。

不管有没有 NS,是否有删除 xmlns 属性或选择节点的方法?还是我做错了?

【问题讨论】:

    标签: xml delphi namespaces xml-namespaces


    【解决方案1】:

    不期望所有命名空间 URI 都引用实际资源。它们主要用作唯一标识符,因此来自多个来源的 XML 可以使用相同的名称而不会相互干扰。它们不需要指向描述命名空间的有效元素和属性值的模式; XML 甚至不需要这样的模式存在。

    如果你想在不考虑命名空间的情况下搜索元素,那么调用FindNode的单参数版本。

    l_tmp := FSOAPBody.ChildNodes.FindNode('ResponseData');
    

    两个参数的版本需要一个命名空间,当您指定一个空字符串时,这意味着您只请求具有空命名空间的节点。由于您显然知道命名空间是什么,因此您无论如何都可以调用两个参数的版本,就像您使用它来获取 body 元素一样:

    l_tmp := FSOAPBody.ChildNodes.FindNode('ResponseData',
               'http://www.example.com/WebServices/Schemas/1');
    

    【讨论】:

      猜你喜欢
      • 2023-03-11
      • 2011-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-30
      • 2019-02-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多