PHP DOMDocument->loadXML с XML, содержащий амперсанд / меньше / больше?

Я пытаюсь разобрать строку XML, содержащую символы & <и> в TEXTDATA. Обычно эти символы должны быть htmlencoded, но в моем случае это не так, поэтому я получаю следующие сообщения:

Предупреждение: DOMDocument::loadXML() [function.loadXML]: ошибка синтаксического анализа имени атрибута в объекте... Предупреждение: DOMDocument::loadXML() [function.loadXML]: Не удалось найти конец начального тега...

Я могу использовать str_replace для кодирования всех &, но если я делаю это с помощью <или>, я делаю это и для допустимых тегов XML.

Кто-нибудь знает обходной путь для этой проблемы?

Спасибо!

4 ответа

Решение

Если у вас есть <внутренний текст в XML... это не правильный XML. Попробуйте закодировать его или заключить в <![CDATA[,

Если это невозможно (потому что вы не выводите этот "XML"), я бы посоветовал попробовать использовать некоторую библиотеку Html-разбора (я не использовал их, но они существуют), потому что они менее строги, чем XML.

Но я бы действительно попытался получить действительный XML, прежде чем пытаться делать что-то другое!!

Я часто использую @ перед вызовами load() для DomDocument, главным образом потому, что вы никогда не можете быть абсолютно уверены, что вы загружаете, то, что вы ожидали.

С помощью @ будет подавлять ошибки.

@$dom->loadXml($myXml);

Я могу использовать str_replace для кодирования всех &, но если я делаю это с помощью <или>, я делаю это и для допустимых тегов XML.

В качестве строго временной меры исправления вы можете заменить те, которые не являются частью того, что похоже на тег или ссылку на сущность, например:

$str= preg_replace('<(?![a-zA-Z_!?])', '&lt;', $str);
$str= preg_replace('&(?!([a-zA-Z]+|#[0-9]+|#x[0-9a-fA-F]+);)', '&amp;', $str);

Однако это не является водонепроницаемым, и в долгосрочной перспективе вам нужно исправить то, что порождает эту фиктивную разметку, или кричать на человека, который должен это исправить, пока он не получит подсказку. Подобно этому грубовато не правильно оформленный XML просто не является XML по определению.

Поместить весь свой текст в элементы CDATA?

<!-- Old -->
<blah>
    x & y < 3
</blah>

<!-- New -->
<blah><![CDATA[
    x & y < 3
]]></blah>
Другие вопросы по тегам