【问题标题】:Read XML File with DOMDocument in php在 php 中使用 DOMDocument 读取 XML 文件
【发布时间】:2016-10-25 16:27:51
【问题描述】:

我想阅读这个 xml 文档:

<?xml version="1.0" encoding="UTF-8"?>
<tns:getPDMNumber xmlns:tns="http://www.testgroup.com/TestPDM" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.testgroup.com/TestPDM getPDMNumber.xsd ">
  <tns:getPDMNumberResponse>
    <tns:requestID>22222</tns:requestID>
    <tns:pdmNumber>654321</tns:pdmNumber>
    <tns:responseCode>0</tns:responseCode>
  </tns:getPDMNumberResponse>
</tns:getPDMNumber>

我是这样尝试的:

$dom->load('response/17_getPDMNumberResponse.xml'); 

$nodes = $dom->getElementsByTagName("tns:requestID");
//$nodes = $dom->getElementsByTagName("tns:getPDMNumber");
//$nodes = $dom->getElementsByTagName("tns:getPDMNumberResponse");
foreach($nodes as $node)
{       
    $response=$node->getElementsByTagName("tns:getPDMNumber");
    foreach($response as $info)
    {
        $test = $info->getElementsByTagName("tns:pdmNumber");
        $pdm = $test->nodeValue;
    }
}

代码永远不会进入 foreach 循环。

仅为了澄清,我的目标是阅读“tns:pdmNumber”节点。

有人有想法吗?

编辑:我也尝试了提交的行。

【问题讨论】:

    标签: php xml dom


    【解决方案1】:

    XML 使用命名空间,因此您应该使用命名空间感知方法。它们的后缀为_NS

    $tns = 'http://www.testgroup.com/TestPDM';
    $document = new DOMDocument();
    $document->loadXml($xml);
    foreach ($document->getElementsByTagNameNS($tns, "pdmNumber") as $node) {
      var_dump($node->textContent);
    }
    

    输出:

    string(6) "654321"
    

    更好的选择是使用 Xpath 表达式。它们允许更舒适地访问 DOM 节点。在这种情况下,您必须为可以在 Xpath 表达式中使用的命名空间注册一个前缀:

    $document = new DOMDocument();
    $document->loadXml($xml);
    $xpath = new DOMXpath($document);
    $xpath->registerNamespace('t', 'http://www.testgroup.com/TestPDM');
    
    var_dump(
      $xpath->evaluate('string(/t:getPDMNumber/t:getPDMNumberResponse/t:pdmNumber)')
    ); 
    

    【讨论】:

      【解决方案2】:

      这个:

      $nodes = $dom->getElementsByTagName("tns:requestID");    
      

      你找到所有的requestID 节点,并尝试循环它们。没关系,但是您可以使用该节点作为基础来查找任何getPDMNumber 节点UNDER requestID - 但什么都没有 - requestID 是一个终端节点。所以

      $response=$node->getElementsByTagName("tns:getPDMNumber");
      

      什么都没发现,内循环也无所谓了。

      这就像说“开始挖一个洞,直到你到达中国。一旦你到达中国,继续挖掘,直到你到达澳大利亚”。但是你不能继续挖掘——你已经到达了“底部”,唯一比中国更深的东西将进入轨道。

      【讨论】:

      • 感谢您的回答。请看我上面的编辑部分。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多