用php中的DOMDocument读取XML文件
我想阅读以下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
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)')
);
谢谢你的回答。请看我上面的编辑部分。