#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 обеспечивает преобразование предопределенных объектов, где это необходимо, для предотвращения проблем с корректностью, а также прозрачно заменяет их символами (т. Е. Он не будет генерировать ссылочные элементы объектов в дереве 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);