嵌套命名空间:如何检索内部节点

时间:2014-03-11 14:41:16

标签: php xpath namespaces xml-namespaces

我有这个场景,由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
  • 的命名空间
  • 获得我想要的东西

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

1 个答案:

答案 0 :(得分:0)

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

DOM API具有方法getElementsByTagNameNS(),用于匹配具有命名空间的元素。

相关问题