在php中使用DOMDocument读取XML文件

时间:2016-10-25 16:27:52

标签: php xml dom

我想阅读这个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循环。

只是为了澄清我的目标是阅读&#34; tns:pdmNumber&#34;节点

有人有想法吗?

编辑:我也尝试过提交行。

2 个答案:

答案 0 :(得分: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)')
); 

答案 1 :(得分:0)

此:

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

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

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

什么也没找到,内循环无关。

这就像说&#34;开始挖洞直到你到达中国。一旦你到达中国,继续挖掘,直到你到达澳大利亚&#34;。但你不能继续挖掘 - 你已经到达了底部&#34;并且唯一比中国深入轨道的东西。