【问题标题】:Nested namespaces: how to retrieve inner nodes嵌套命名空间:如何检索内部节点
【发布时间】:2014-04-15 06:14:11
【问题描述】:

我有这种情况,由 SOAP WS 返回

<?xml version="1.0" encoding="utf-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <soapenv:Body>
        <ns1:myFunctionEnvelopeName xsi:type="xsd:string" xmlns:ns1="http://fooNameSpace.comm">
            <myFunctionName xmlns="http://barNameSpace.com">
                [some nodes here]
            </myFunctionName>
        </ns1:myFunctionEnvelopeName>
    </soapenv:Body>
</soapenv:Envelope>

我想选择 myFunctionName 的子节点,但我有一些问题

  • 如果我将ns1 命名空间注册到我的XPath,我只能选择myFunctionEnevelopeName(即使我尝试使用getElementsByTagName(),我也会收到0 个节点
  • 如果我注册,比如说,ns2 和 barNameSpace.com,我的查询将不会返回我的元素
    • 如果我不注册任何命名空间,我的查询将不会返回我的元素

我发现的唯一解决方法是

  • 将ns1注册为XPath的命名空间
  • 检索“主节点”(myFunctionEnevelopeName)
  • 从“主节点”中提取textContent(这当然是一个有效的xml)
  • 用获得的文字内容创建一个全新的Xpath
  • 注册ns2为全新Xpath的命名空间
  • 得到我想要的

我确信存在一个聪明的方法来做到这一点,但也许我不知道。有人可以指点一下吗?

【问题讨论】:

    标签: php xpath namespaces xml-namespaces


    【解决方案1】:

    XPath 本身不会阻止您注册多个名称空间,因此您可以在 XPath 表达式中使用多个前缀。例如/ns1:element-1/ns2:element-2。完全不使用前缀与匹配没有命名空间的元素是一样的。

    DOM API 有 getElementsByTagNameNS() 方法用于将元素与命名空间匹配。

    【讨论】:

    • 如果我进行类似//ns1:myFunctionEnvelopeName/myFunctionName/myNode 的查询,我不会得到任何回报,所以我想我唯一的方法就是按照我的方法...
    • 在该查询中 myFunctionName 不属于任何命名空间,但在您的示例文档中 myFunctionName 有一个命名空间定义,声明为默认命名空间。
    • 那么如何查询默认ns呢?我需要用xmlns 前缀查询吗?
    • 查询前缀命名空间的方式相同。您将命名空间 URI 注册到前缀映射并在 XPath 查询中使用该前缀。 XPath 不要求前缀与文档中使用的前缀相同。命名空间注册是如何完成的,取决于您使用的语言/库/XPath 框架/引擎。
    • 我会尽力让你知道 ;)
    猜你喜欢
    • 2015-01-08
    • 1970-01-01
    • 1970-01-01
    • 2021-12-23
    • 1970-01-01
    • 2018-02-03
    • 1970-01-01
    • 2020-05-20
    • 2020-08-07
    相关资源
    最近更新 更多