Php simplexml使用xpath和xpathnamespace查找节点的值-未定义的偏移量:0

Php simplexml使用xpath和xpathnamespace查找节点的值-未定义的偏移量:0,php,xml,xpath,simplexml,xml-namespaces,Php,Xml,Xpath,Simplexml,Xml Namespaces,我不熟悉PHP simplexml代码,我发现该代码确实为变量$xml\u record\u congreant\u提供了结果 我尝试添加名称空间标识符(请参阅注释掉的代码),但没有结果-它返回“未定义的偏移量:0” 是否需要对名称空间标识符进行某种修改? 谢谢你的任何线索 PHP文件: $url_congrant_file = "test.xml"; $xml_congrant_feed = simplexml_load_file($url_congrant_file); $xml_cong

我不熟悉PHP simplexml代码,我发现该代码确实为变量$xml\u record\u congreant\u提供了结果

我尝试添加名称空间标识符(请参阅注释掉的代码),但没有结果-它返回“未定义的偏移量:0”

是否需要对名称空间标识符进行某种修改? 谢谢你的任何线索

PHP文件:

$url_congrant_file = "test.xml";

$xml_congrant_feed = simplexml_load_file($url_congrant_file);
$xml_congrant_feed->registerXPathNamespace('a','http://www.digitalmeasures.com/schema/data');//
$xml_congrant_feed->registerXPathNamespace('dmd','http://www.digitalmeasures.com/schema/data-metadata');

$username="bill-smith";
$username=strtolower($username); 
$xml_record=$xml_congrant_feed->xpath('//a:Record[contains(translate(@username,"ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz"),"'.$username.'")]');

echo '<br>$xml_record[0] is...'.$xml_record[0]['username'];

$xml_record_congrant_funded = $xml_record[0]->xpath('CONGRANT[STATUS="Funded"]');
//$xml_record_congrant_funded = $xml_record[0]->xpath('./dmd:CONGRANT[STATUS="Funded"]');
//this needs to store all 'congrant' nodes with the status of "funded" 

echo '<br>$xml_record_congrant_funded[0] is...'.$xml_record_congrant_funded[0]->status;
//this needs to display the value of the 'status' node


//I've put in the actual constants for the $offset (0), $per_page (2)   
for ($i = 0; $i < (0 + 2); $i++) {
        echo '<br>$i is...'.$i;
        $strCongrant_id = $xml_record_congrant_funded[$i]->ident;
        echo '<br>$strCongrant_id...'.$strCongrant_id;
        $strCongrant_status = $xml_record_congrant_funded[$i]->status;
        echo '<br>$strCongrant_id...'.$strCongrant_status;
        //this yields no results 
}   
var_dump($xml_record_congrant_funded);
print_r($xml_record_congrant_funded);
$url\u congreant\u file=“test.xml”;
$xml\u congreant\u feed=simplexml\u load\u文件($url\u congreant\u文件);
$xml\u congreant\u feed->registerXPathNamespace('a','http://www.digitalmeasures.com/schema/data');//
$xml\u congreant\u feed->registerXPathNamespace('dmd','http://www.digitalmeasures.com/schema/data-metadata');
$username=“比尔·史密斯”;
$username=strtolower($username);
$xml_record=$xml_congreant_feed->xpath('//a:record[contains(translate(@username,“abcdefghijklmnopqrstuvxyz”,“abcdefghijklmnopqrstuvxyz”),“.$username.”);
echo“
$xml_记录[0]是…”。$xml_记录[0]['username']; $xml\u record\u congreant\u funded=$xml\u record[0]->xpath('congreant[STATUS=“funded”]”); //$xml\u record\u congreant\u funded=$xml\u record[0]->xpath('./dmd:congreant[STATUS=“funded”]); //这需要存储状态为“已资助”的所有“一致”节点 echo“
$xml\u record\u congreant\u funded[0]是…”。$xml\u record\u congrent\u funded[0]>状态; //这需要显示“状态”节点的值 //我已经输入了$offset(0)和$peru页面(2)的实际常量 对于($i=0;$i<(0+2);$i++){ 回声“
$i是…”。$i; $strCongrant\u id=$xml\u record\u congrent\u出资[$i]>ident; 回显“
$strCongrant\u id…”。$strCongrant\u id; $strCongrant\u status=$xml\u record\u congreant\u funded[$i]>status; 回显“
$strCongrant\u id…”。$strCongrant\u状态; //这不会产生任何结果 } var\u dump($xml\u记录\u一致性\u资助); 打印($xml\U记录\U一致性\U资助);
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="2019-09-09">
    <Record userId="9a" username="bill-smith" termId="2" dmd:surveyId="1">
        <dmd:IndexEntry indexKey="DE" entryKey="S7" text="S7"/>
        <CONGRANT id="12" dmd:originalSource="MA" dmd:created="2018-03-30T14:22:43" dmd:lastModifiedSource="MA" dmd:lastModified="2019-02-19T10:49:07" dmd:startDate="2017-08-08" dmd:endDate="2022-07-31">
            <TYPE>Book Grant</TYPE>
            <TITLE>Modulation Theory</TITLE>
            <STATUS>Funded</STATUS>
        </CONGRANT>
        <CONGRANT id="11" dmd:originalSource="MA" dmd:created="2019-07-05T10:14:55" dmd:lastModifiedSource="MA" dmd:lastModified="2019-07-05T10:17:44" dmd:startDate="2019-06-15" dmd:endDate="2019-06-15">
            <TYPE>Digital Grant</TYPE>
            <TITLE>Frequency Modulation</TITLE>
            <STATUS/>
        </CONGRANT>
        <CONGRANT id="16" dmd:originalSource="MA" dmd:created="2018-03-26T11:39:42" dmd:lastModifiedSource="MA" dmd:lastModified="2018-03-26T11:40:15" dmd:startDate="2017-10-04" dmd:endDate="2017-10-04">
            <TYPE>Book Grant</TYPE>
            <TITLE>Ferrite Curves</TITLE>
            <STATUS>Currently Under Review</STATUS>
        </CONGRANT>
    </Record>
</Data>

助学金
调制理论
提供资金
数字赠款
调频
助学金
铁素体曲线
目前正在审查中

当您在SimpleXML中的单个节点上使用XPath时,每次需要使用时都必须注册名称空间,并且由于所有节点都位于默认名称空间中(您在代码中使用了
a
作为前缀),因此需要不断添加它

因此,在第二个XPath中,您需要在
$xml_record[0]
上注册相同的名称空间,然后将其用作表达式
'a:congreant[a:STATUS=“Funded”]
中的前缀

$xml_record[0]->registerXPathNamespace('a','http://www.digitalmeasures.com/schema/data');//
$xml_record_congrant_funded = $xml_record[0]->xpath('a:CONGRANT[a:STATUS="Funded"]');

echo '<br>$xml_record_congrant_funded[0] is...'.$xml_record_congrant_funded[0]->STATUS;
$xml\u记录[0]->registerXPathNamespace('a','http://www.digitalmeasures.com/schema/data');//
$xml\u record\u congreant\u funded=$xml\u record[0]->xpath('a:congreant[a:STATUS=“funded”]);
echo“
$xml\u record\u congreant\u funded[0]是…”。$xml\u record\u congrent\u funded[0]>状态;

还请注意,您需要对对象元素使用与XML中相同的大小写-因此它是
$XML\u record\u congrent\u funded[0]->STATUS

谢谢。例如,对于默认名称空间,如果我选择不使用前缀,是否仍需要注册名称空间?如果不使用前缀,则无需注册它。请记住,默认名称空间中的任何内容都仍然在名称空间中,尽管它没有前缀(我希望它有意义:-/),谢谢。作为一个测试,我一直在删除这个前缀。虽然XML文档没有指定“a”,但当我在整个文档中删除“a”引用时,我会在第19行中得到“未定义的偏移量”(
$XML\u record[0]['username']
),当您使用
registerXPathNamespace()
时,您可以使用任何想要的前缀,重要的是,第二个参数必须与文档中定义的参数匹配。因此,如果文档中的元素在名称空间中,那么您需要在XPath中匹配它。否-您需要注册它并使用您定义的前缀(因此需要在XPath中使用:)。