【问题标题】:XPATH and XML with namespaces带有命名空间的 XPATH 和 XML
【发布时间】:2012-07-23 15:28:50
【问题描述】:

考虑以下 XML:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
   <s:Body>
      <myResponse xmlns="https://example.com/foo">
         <myResult xmlns:a="https://example.com/bar" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
            <a:accountNumber>AAA</a:accountNumber>
            <a:accountName>BBB</a:accountName>
            <a:accountType>CCC</a:accountType>
         </myResult>
      </myResponse>
   </s:Body>
</s:Envelope>

我正在尝试选择 myResult 及其下面的所有元素。

我得到的最接近的是:

//*[local-name()='myResult']//a:*

这让我得到了元素的值,但我不知道哪个值属于哪个元素。

我在 PHP 中执行此操作,这是(大致)我正在使用的代码:

<?php
$xmlObject = new SimpleXMLElement($result);
$namespaces = $xmlObject->getNamespaces(true);
foreach($namespaces as $key => $value) {
   if($key == '') {
      $key = 'ns';
   }
   $xmlObject->registerXPathNamespace($key, $value);
}
$element = $xmlObject->xpath("//myResult");
?>

我知道有很多关于 XPath 和 XML 名称空间的问题(哦,我是如何搜索的),但我还没有找到与我的特定情况相匹配的问题。我想做的事有可能吗?

【问题讨论】:

    标签: php xml xpath


    【解决方案1】:

    您的//*[local-name()='myResult']//a:* 工作正常。您只需要循环并使用getName 来获取标签的名称。

    $element = $xmlObject->xpath("//*[local-name()='myResult']//a:*");
    foreach($element as $e){
        echo $e->getName() . ': '. (string)$e;
    }
    

    演示:http://codepad.org/BAefIKZ4

    编辑:既然您要注册命名空间,为什么不使用它们呢?

    $element = $xmlObject->xpath("//ns:myResult//a:*");
    

    演示:http://codepad.org/9MKq5oDt

    【讨论】:

    • 啊,是的。实际上使用命名空间更有意义。感谢您的详尽回复!
    【解决方案2】:

    当您将默认命名空间定义为“ns”时,请使用:

    $element = $xmlObject->xpath("//ns:myResult");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-05
      • 2011-08-07
      • 1970-01-01
      • 1970-01-01
      • 2011-07-24
      • 2014-04-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多