Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用php中的DOMDocument读取XML文件_Php_Xml_Dom - Fatal编程技术网

用php中的DOMDocument读取XML文件

用php中的DOMDocument读取XML文件,php,xml,dom,Php,Xml,Dom,我想阅读以下xml文档: 22222 654321 0 我这样试过: $dom->load('response/17_getPDMNumberResponse.xml'); $nodes = $dom->getElementsByTagName("tns:requestID"); //$nodes = $dom->getElementsByTagName("tns:getPDMNumber"); //$nodes = $dom->getElementsByTagN

我想阅读以下xml文档:


22222
654321
0
我这样试过:

$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”节点

有人有主意吗

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

这:

$nodes = $dom->getElementsByTagName("tns:requestID");    
找到所有
requestID
节点,并尝试在其上循环。这很好,但是您可以使用该节点作为基础,在
requestID
下查找任何
getPDMNumber
nodes-但是没有任何内容-requestID是一个终端节点。所以

$response=$node->getElementsByTagName("tns:getPDMNumber");
找不到任何内容,而内部循环与此无关


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

XML使用名称空间,因此你应该使用名称空间感知方法。它们的后缀为
\n

$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)')
); 

谢谢你的回答。请看我上面的编辑部分。