PHP - simpleXML 故障排除中子节点中的命名空间移位



我正在使用SimpleXML和XPath来尝试获取子节点('IndexEntry(属性('indexKey'(的值。 节点的命名空间,我已经在另一个节点上成功测试("记录"(。由于某种原因,此节点的属性("索引键"(未返回。 我尝试使用 children 方法访问节点,同时指定其命名空间。

PHP代码

<?php
$url = "test_bb.xml";

$xml = simplexml_load_file($url);
$xml->registerXPathNamespace('a','http://www.digitalmeasures.com/schema/data');
$xml->registerXPathNamespace('dmd','http://www.digitalmeasures.com/schema/data-metadata');
$xml_report_abbrev_bb = $xml->xpath('//a:Record[@username="john-smith"]');
if($xml_report_abbrev_bb){
    echo '<br>CONTYPE is...'.$xml_report_abbrev_bb[0]->INTELLCONT->CONTYPE;
    echo '<br>termId is...'.$xml_report_abbrev_bb[0]['termId'].'<br>';
    echo '<br>surveyId is...'.$xml_report_abbrev_bb[0]->attributes('dmd',true)['surveyId'].'<br>';
//below - I've tried different methods of accessing the IndexEntry node...
    $dmd_fields = $xml_report_abbrev_bb[0]->children('dmd',true);
    echo '<br>dmd:IndexEntry is...'.$dmd_fields->IndexEntry['indexKey'].'<br>';
    echo '<br>dmd:IndexEntry is...'.$xml_report_abbrev_bb[0]->children('dmd',true)->IndexEntry['indexKey'].'<br>';
    //echo '<br>dmd:IndexEntry is...'.$xml_report_abbrev_bb[0]->IndexEntry('dmd',true)['indexKey'].'<br>';
    //echo '<br>dmd:IndexEntry is...'.$xml_report_abbrev_bb[0]->xpath('/dmd:indexEntry[@indexKey]')[0].'<br>';

} else {
    echo 'XPath query failed b';  
}
?>

XML ('test_bb.xml'(

<?xml version="1.0" encoding="UTF-8"?>
<Data xmlns="http://www.digitalmeasures.com/schema/data" xmlns:dmd="http://www.digitalmeasures.com/schema/data-metadata" dmd:date="2012-01-03">
    <Record userId="148" username="john-smith" termId="4" dmd:surveyId="12">
        <dmd:IndexEntry indexKey="D" entryKey="Dylan" text="Dylan"/>
        <INTELLCONT id="14" dmd:originalSource="54TEX" dmd:lastModified="2017-04-18T10:54:29" dmd:startDate="2011-01-01" dmd:endDate="2011-12-31">
            <CONTYPE>Sales Tools</CONTYPE>
            <CONTYPEOTHER>Sales History</CONTYPEOTHER>
            </INTELLCONT>
    </Record>
</Data>

在行中

$dmd_fields = $xml_report_abbrev_bb[0]->children('dmd', true);

这意味着$dmd_fields将是一个节点列表,即使列表中只有一个节点 - 因此请使用$dmd_fields[0]引用<dmd:IndexEntry>元素。 由于这是IndexEntry元素,只需使用它和该元素的列表属性即可...

echo '<br>dmd:IndexEntry is...'.$dmd_fields[0]->attributes()['indexKey'].'<br>';

尽管 IndexEntry 元素位于 http://www.digitalmeasures.com/schema/data-metadata 命名空间中,如本地前缀 dmd: 所示,但其属性没有前缀

<dmd:IndexEntry indexKey="D" entryKey="Dylan" text="Dylan"/>

本文档中的无前缀元素位于根节点上的 xmlns= 属性中指定的 http://www.digitalmeasures.com/schema/data 命名空间中。

但正如在这个问题上所讨论的,XML 命名空间规范说属性永远不会在默认命名空间中。这尤其使它们根本不在命名空间中,因此要使用 SimpleXML 访问它们,您必须选择其 URI 为空字符串的命名空间:

$dmd_fields->IndexEntry->attributes('')->indexKey;

最新更新