SimpleXML получает исходное значение элемента

#php #xml #simplexml

#php #xml #simplexml

Вопрос:

У меня есть следующий XML-код, и я должен использовать SimpleXML:

 <CATEGORY_TREE>/Gryamp;#47;Puzzle/puzzle/</CATEGORY_TREE>
<CATEGORY_NAME>/Gryamp;#47;Puzzle/puzzle/</CATEGORY_NAME>
  

$node->CATEGORY_TREE возвращает /Gry/Puzzle/puzzle/ правильное значение.

Любой способ получить необработанное значение /Gryamp;#47;Puzzle/puzzle/ ?

Ответ №1:

Только если не использовать синтаксический анализатор XML на основе LibXML2 (SimpleXML, DOM, XmlReader). Все они принудительно заменяют предопределенные объекты.

Из документации LibXML2:

Обратите внимание, что во время сохранения libxml2 обеспечивает преобразование предопределенных объектов, где это необходимо, для предотвращения проблем с корректностью, а также прозрачно заменяет их символами (т. Е. Он не будет генерировать ссылочные элементы объектов в дереве DOM или вызывать обратный вызов reference() SAX при нахождении их во входных данных).

Для синтаксического анализатора XML ‘/’ и ‘ ‘ равны. Чтобы сохранить объект в XML, его amp; нужно было бы экранировать. Если вы создадите его как текстовый узел в DOM, вы увидите, что DOM сделает это для сериализации:

 $document = new DOMDocument();
$document
  ->appendChild($document->createElement('CATEGORY_TREE'))
  ->appendChild($document->createTextNode('/Gryamp;#47;Puzzle/puzzle/'));
echo $document->saveXml();
  

Вывод:

 <?xml version="1.0"?>
<CATEGORY_TREE>/Gryamp;amp;#47;Puzzle/puzzle/</CATEGORY_TREE>
  

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

1. Кажется, я забыл упомянуть, что я анализирую XML, а не создаю его.

2. Я это понял, но для синтаксического анализатора XML / и amp;#43; то же самое. таково /Gry/Puzzle/puzzle/ и исходное значение (по крайней мере, для синтаксических анализаторов XML на основе libxml2). Если вы хотите читать amp;#43; как объект, лучшим решением будет то, что программа / скрипт кодирует объект. В противном случае вам придется использовать анализатор XML, который не заменяет предопределенные объекты по умолчанию или строковые функции (он же напишите свой собственный анализатор). Будьте готовы к другим проблемам в этом случае. Вот причины, по которым LibXML2 заменяет их.

Ответ №2:

используйте функцию html_entity_decode():

 <?php
echo html_entity_decode($node->CATEGORY_TREE);