PHP RegisterXPathNamespace - 未知来源的XML前缀

时间:2018-01-09 20:58:39

标签: php xml xpath simplexml

我在这里对PHP / XPath很新。我在PHP中使用SimpleXML和XPath,使用命名空间遍历XML。

我的问题是关于registerXPathNamespace函数中的'prefix'参数 我的xml Feed中有两个xmlns;但是,在这种情况下,我不确定如何使用该功能 当我运行此代码时,我收到以下错误信息:

Undefined offset: 0

我的XML无法以任何方式更改。 请参阅下面的代码。感谢任何线索。

PHP代码:

<?php
$url = 'test.xml';

$simplexml = simplexml_load_file($url);
//below, I'm uncertain as to what should be the prefix, 
//in the case of no apparent prefix in the xml - I've seen 'a' in other      
//examples (where the prefix does not exist in the xml), but unsure why.
$simplexml->registerXPathNamespace('a','http://www.digitalmeasures.com/schema/data');//
//below, as the 'dmd' prefix is in the xml, I've included it here.
$simplexml->registerXPathNamespace('dmd','http://www.digitalmeasures.com/schema/data-metadata');
//

$myDataObjects2 = $simplexml->xpath('//Record/INTELLCONT[@id="14"]/CONTYPE')[0];
//$myDataObjects2 = $simplexml->xpath('//Record/INTELLCONT/CONTYPE')[0];
echo $myDataObjects2;
?>

XML:

<Data xmlns="http://www.digitalmeasures.com/schema/data" xmlns:dmd="http://www.digitalmeasures.com/schema/data-metadata" dmd:date="2018-01-03">
    <Record userId="148" username="john-doe" termId="44" dmd:surveyId="12">
        <dmd:IndexEntry indexKey="DEPARTMENT" entryKey="Toocas-CK" text="Toocas-CK"/>
        <INTELLCONT id="14" dmd:originalSource="MANUAL" dmd:lastModified="2017-02-21T15:21:45" dmd:startDate="2016-05-01" dmd:endDate="2016-07-31">
            <CONTYPE>Author Content</CONTYPE>
            <CONTYPEOTHER/>
            <NEWREV>Revised</NEWREV>
            <STATUS>Accepted</STATUS>
        </INTELLCONT>
    </Record>
</Data>

2 个答案:

答案 0 :(得分:3)

您已注册名称空间

$simplexml->registerXPathNamespace('a','http://www.digitalmeasures.com/schema/data');

你需要说xpath你正在查找的节点属于那个命名空间

//a:Record/a:INTELLCONT[@id="14"]/a:CONTYPE

demo

答案 1 :(得分:2)

你所拥有的是什么称为默认命名空间 - @ViewChild ('input1') el: ElementRef; // the # is used in html only .... async ngOnInit() { setTimeout(() => { this.el.nativeElement.focus(); // with ElementRef should work, but if you encounter any problem just use 'any' type }, 1000); }并且默认情况下它在XML中没有前缀 - 它只是假设在那里。

但是在你的代码中,你需要给它一个名字,所以在你的情况下你给它一个'a'的前缀......

xmlns="http://www.digitalmeasures.com/schema/data"

因此在你的XPath中,原始文档中的元素没有前缀 - 它使用默认命名空间,并且在你的代码中你说它应该有一个前缀'a'。所以你的XPath应该是......

$simplexml->registerXPathNamespace('a','http://www.digitalmeasures.com/schema/data');