DOMXPath - 获取节点
问题描述:
我遇到了一个我无法解决的问题。我使用DOMXPath检索MsgId
标签下面的XML文件中的值:DOMXPath - 获取节点
<?xml version="1.0" encoding="UTF-8"?>
<Document xmlns="urn:iso:std:iso:20022:tech:xsd:pain.001.001.03" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<CstmrCdtTrfInitn>
<GrpHdr>
<MsgId>Test/20171013/CCT100621</MsgId>
<CreDtTm>2017-10-13T10:06:21</CreDtTm>
<NbOfTxs>62</NbOfTxs>
</GrpHdr>
</CstmrCdtTrfInitn>
</Document>
以下是我的PHP代码片段来查询与DOMXPath的XML:
$xml = <<<XML
<?xml version="1.0" encoding="UTF-8"?>
<Document xmlns="urn:iso:std:iso:20022:tech:xsd:pain.001.001.03" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<CstmrCdtTrfInitn>
<GrpHdr>
<MsgId>Test/20171013/CCT100621</MsgId>
<CreDtTm>2017-10-13T10:06:21</CreDtTm>
<NbOfTxs>62</NbOfTxs>
</GrpHdr>
</CstmrCdtTrfInitn>
</Document>
XML;
$document = new DOMDocument;
$document->loadXML($xml);
$groupHeaderXPath = new DOMXPath($document);
echo $groupHeaderXPath->query('//GrpHdr/MsgId')->length; // returns 0
我测试与此tool查询,它似乎是正确的。
有没有人有一个想法,为什么xpath表达式在这种情况下不起作用?我在这里错过了一些细节吗?
答
$groupHeaderXPath
的类型为DOMXPath,它有一个方法registerNamespace。
我认为这将有助于注册名称空间并在xpath表达式中使用前缀'urn'。
例如:
$rootNamespace = $document->lookupNamespaceUri($document->namespaceURI);
$groupHeaderXPath->registerNamespace("urn", $rootNamespace);
echo $groupHeaderXPath->query('//urn:GrpHdr/urn:MsgId')->length; // returns 1
这就是问题。如果删除名称空间,它将正常工作,因为所有内容都位于默认名称空间中。 – prodigitalson
谢谢它完美的作品:) – BwaBwa