我想阅读这个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;节点
有人有想法吗?
编辑:我也尝试过提交行。答案 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;并且唯一比中国深入轨道的东西。