PHP DOMDocument-> loadXML с XML, содержащий амперсанд / меньше / больше? - PullRequest
1 голос
/ 12 января 2010

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

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

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

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

Спасибо!

Ответы [ 4 ]

5 голосов
/ 12 января 2010

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

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

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

3 голосов
/ 12 января 2010

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

Использование @ подавит ошибки.

@$dom->loadXml($myXml);
1 голос
/ 12 января 2010

Я могу использовать 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 по определению.

0 голосов
/ 12 января 2010

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

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

<!-- New -->
<blah><![CDATA[
    x & y < 3
]]></blah>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...