xml считывает поле по имени

#php #xml

#php #xml

Вопрос:

Привет, я должен прочитать XML-файл, в части кода есть некоторая метка поля с именем, как указано в примере

        <Fields>
        <Field Name="JobId"><![CDATA[7096c681-3165-4137-95a3-4ae873af2132]]></Field>
        <Field Name="isDeleted"><![CDATA[0]]></Field>
        <Field Name="TopicId"><![CDATA[5870811]]></Field>
        <Field Name="Type"><![CDATA[Document]]></Field>
        <Field Name="CustomerId"><![CDATA[8063]]></Field>
        <Field Name="DocumentType"><![CDATA[volopress_pdf]]></Field>
        <Field Name="Inserted"><![CDATA[2021-01-02 08:47:51]]></Field>
        <Field Name="pageNumber"><![CDATA[17]]></Field>
        <Field Name="Position"><![CDATA[1]]></Field>
        <Field Name="TAG_Source"><![CDATA[Cronache di Napoli]]></Field>
        <Field Name="link_pdf"><![CDATA[http://www.pippo.com]]></Field>
        <Field Name="TAG_Topic"><![CDATA[Terremoti]]></Field>
        <Field Name="isValidSnippet"><![CDATA[True]]></Field>
      </Fields>
 

Я хочу прочитать только поле с именем «link_pdf»

Если я использую этот код

 $alink = $rassegna->Fields->Field[23];
 

Я могу прочитать значение, но в некоторых случаях это не очень хорошая работа, как я могу получить доступ к значению по имени поля?

 $alink = $rassegna->Fields->Field['link_export'];
 

не работает

Комментарии:

1. Вам нужно перебирать поля, пока не найдете поле со значением Name атрибута, которое вы ищете. Или используйте XPath, чтобы найти элемент на основе его содержимого атрибута Name напрямую.

Ответ №1:

Используйте XPath, чтобы выбрать Field и применить предикат, ограничивающий тот (ы), который имеет Name значение атрибута «link_export»:

 $xml = new SimpleXMLElement($string);
$result = $xml->xpath('/Fields/Field[@Name="link_export"]');
while(list( , $node) = each($result)) {
  echo '/Fields/Field[@Name="link_export"]: ',$node,"n";
}
 

Ответ №2:

Вы можете обнаружить, что элементы по одному xpath не соответствуют всей структуре исходного xml

 $xml = simplexml_load_file('02012021.xml');
$result = $xml->xpath('//Field[@Name="link_pdf"]');
foreach($result as $node) {
    echo "$node<br>n";
}
 

Ответ №3:

К сожалению, я должен следовать всей структуре, потому что в дополнение к этой записи я должен читать другие

 <?php

$xml=simplexml_load_file("02012021.xml") or die("Error: Cannot create object");
$i=0;
foreach($xml->Reports->Report[1]->Hits[0]->children() as $rassegna) {
        echo $rassegna->Order . "<br>";
        echo $rassegna->DocumentReference . "<br>";
        echo $rassegna->Title . "<br>";
        echo $rassegna->Content . "<br>";
        $alink = $xml->xpath('//Field[@Name="link_export"]');
        echo $alink[$i] . "<br>";
        echo "<a href='". $alink[$i] . "'> link </a>";
        echo "<br/><br/>";
        $i=$i 1;
}
?>
 

Я решил это с помощью только что опубликованного решения