【问题标题】:DOMXPath - Get NodeDOMXPath - 获取节点
【发布时间】:2017-10-17 10:43:44
【问题描述】:

我遇到了一个我无法解决的问题。我正在使用 DOMXPath 检索以下 XML 文件的 MsgId 标记的值:

<?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>

以下是我用 DOMXPath 查询 XML 的 PHP 代码 sn-p:

$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 表达式在这种情况下不起作用?我在这里遗漏了一些细节吗?

【问题讨论】:

    标签: php xml xpath


    【解决方案1】:

    $groupHeaderXPathDOMXPath 类型,它有一个方法registerNamespace

    我认为注册命名空间并在 xpath 表达式中使用前缀“urn”会有所帮助。

    例如:

    $rootNamespace = $document->lookupNamespaceUri($document->namespaceURI);
    $groupHeaderXPath->registerNamespace("urn", $rootNamespace);
    echo $groupHeaderXPath->query('//urn:GrpHdr/urn:MsgId')->length; // returns 1
    

    【讨论】:

    • 这就是问题所在。如果您删除命名空间,它将正常工作,因为所有内容都在默认命名空间中。
    猜你喜欢
    • 1970-01-01
    • 2012-05-10
    • 1970-01-01
    • 1970-01-01
    • 2013-02-20
    • 1970-01-01
    • 1970-01-01
    • 2013-04-09
    • 2014-12-27
    相关资源
    最近更新 更多