Я в замешательстве по поводу синтаксического анализа XML в PHP

#php #xml #parsing

#php #xml #синтаксический анализ

Вопрос:

Как я могу проанализировать XML-данные с помощью PHP? Я хочу получить содержимое только элемента с именем

 <profile xmlns="mysite.com">
 <confirmationNumber>128686132</confirmationNumber>
 <merchantRefNum>123456</merchantRefNum>
 <customerEmail>test@test.com</customerEmail>
</profile>
  

Я пытался использовать этот код

  $sxe = new SimpleXMLElement($decodedMessage);
 echo $sxe->getName() . "n";
 foreach ($sxe->children() as $child)
 {
 echo $child->getName() . "n";
 }
  

Но я не знаю, как выбрать конкретный элемент.

Ответ №1:

Вам не нужны методы обхода SimpleXML. Просто используйте simplexml_load_string() , если у вас уже есть это в одном:

 $xml = simplexml_load_string($decodedMessage);
  

Тогда доступ к содержимому так прост, как:

 print $xml->customerEmail;
  

Ответ №2:

Вы можете попробовать функцию simplexml_load_file() и использовать XML в качестве объекта. Или преобразовать в массив с помощью приведения.

Ответ №3:

Вам следует взглянуть на xpath.

Ответ №4:

Один из самых простых способов справиться с этим — поискать в Google функцию под названием xml2array, поскольку с ассоциативными массивами в PHP работать намного проще, чем с XML.

Ответ №5:

вы можете попробовать это.

 $xml = simplexml_load_file($filePath) or die ("Unable to load XML file!"); 
//Access XML Data
echo "confirmation Number: " . $xml->confirmationNumber;
echo "merchant Ref Num: " . $xml->confirmationNumber; 
echo "customer Email: " . $xml->customerEmail;
  

Ответ №6:

Если вы хотите найти этот элемент в документе большего размера, вы могли бы использовать XPath.

Например, для XML

 <some>
  <hierarchy>
    <profile>
      <etc>et cetera</etc>
    </profile>
  </hierarchy>
</some>
  

вы можете просто выполнить $sxe->xpath('//profile') , который вернет массив всех элементов профиля повсюду в документе (в виде SXES, которые вы можете затем обработать). Если есть только один элемент profile, то все готово, но если их много, вам понадобится более конкретный XPath.