simplexml находит значение узла, используя xpath с xpathnamespace - неопределенное смещение: 0 - PullRequest
1 голос
/ 30 сентября 2019

Я новичок в коде PHP simplexml и обнаружил, что этот код предоставляет результаты для переменной $ xml_record_congrant_funded.

Я попытался добавить идентификаторы пространства имен (см. Закомментированный код), но результата нет - возвращается «Неопределенное смещение: 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);

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>

1 Ответ

1 голос
/ 30 сентября 2019

Поскольку вы используете XPath на отдельном узле в SimpleXML, вам необходимо регистрировать пространство имен каждый раз, когда вы хотите его использовать, и так как все узлы находятся в пространстве имен по умолчанию (которое вы использовали a в качестве префиксав вашем коде) вам нужно продолжать добавлять его.

Итак, во втором XPath вам нужно зарегистрировать то же пространство имен на $xml_record[0], чтобы затем использовать его в качестве префикса в выражении 'a:CONGRANT[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 - так что это $xml_record_congrant_funded[0]->STATUS.

...