Как проанализировать этот XML и выполнить поиск определенного значения ключа

#php #xml

#php #xml

Вопрос:

У меня есть следующее содержимое xml :

 <?xml version="1.0" encoding="UTF-8"?>
<methodResponse>
   <params>
      <param>
         <value>
            <array>
               <data>
                  <value>
                     <array>
                        <data>
                           <value>
                              <string>Car</string>
                           </value>
                           <value>
                              <string>1</string>
                           </value>
                        </data>
                     </array>
                  </value>
                  <value>
                     <array>
                        <data>
                           <value>
                              <string>Plane</string>
                           </value>
                           <value>
                              <string>2</string>
                           </value>
                        </data>
                     </array>
                  </value>
                  <value>
                     <array>
                        <data>
                           <value>
                              <string>Boat</string>
                           </value>
                           <value>
                              <string>3</string>
                           </value>
                        </data>
                     </array>
                  </value>
               </data>
            </array>
         </value>
      </param>
   </params>
</methodResponse>
  

Я хотел бы восстановить число 3 , зная только данные Boat

Вот что я сделал :

 $xml = new SimpleXMLElement($response);
$arr_response = $xml->params->param->value->array->data->value->array->data;
foreach ($arr_response as $key => $value) {
    if($key == "Boat"){
        echo "Found !";
        echo "$key -> $value";
    }else{
        echo "Not found";
    }
}
  

Вывод :

 Not found
  

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

1. У вас здесь опечатка foreach ($arr_res as $key => $value) { arr_res должно быть arr_response?

2. Пожалуйста, включите правильное сообщение об ошибках PHP во время разработки, тогда у PHP будет возможность предупредить вас о таких ошибках самостоятельно.

Ответ №1:

Поскольку вы имеете дело с xml, проще просто использовать xpath:

 $xml = simplexml_load_string($response);
$boat = $xml->xpath('//data//value[string="Boat"]/following-sibling::value/string');
echo $boat[0];
  

Вывод:

 3
  

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

1. @executable Поверьте мне в этом — определенно стоит ознакомиться с xpath.

Ответ №2:

Вы могли бы использовать DomDocument как в

 $doc = new DOMDocument();
$doc->loadXML($data);

$xpath = new DOMXPath($doc);

foreach ($xpath->query("//data[./value[1]/string[contains(text(), 'Boat')]]") as $boat) {
    echo $boat->getElementsByTagName("string")[1]->textContent;
}