Как устранить ошибку «ошибка синтаксического анализатора simplexml_load_file (): объект nbsp не определен»? - PullRequest
1 голос
/ 02 июня 2011

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

$str = str_ireplace(array('<','>','&','\'','"'),array('&lt;','&gt;','&amp;','&apos;','&quot;'),$str);

но все же вызывает ошибку.

simplexml_load_file() [function.simplexml-load-file] *[file name]* parser error : Entity 'nbsp' not defined in *[file name] [line]*

Текст ошибки здесь:

Dallas&nbsp;&nbsp;Dallas () is the third-largest city in Texas and the ninth-largest in the United States.

В IE8, похоже, ошибка в (). Так сколько символов я должен заметить?

Ответы [ 3 ]

4 голосов
/ 02 июня 2011

&nbsp; является сущностью HTML, но не существует в XML.

Либо избавьтесь от этого (вы не говорите, откуда он берется, поэтому трудно дать какой-то более конкретный совет), либо оберните ваши HTML-данные в блоки CDATA, чтобыпарсер их игнорирует.

3 голосов
/ 02 июня 2011

Специфичные для HTML сущности - в данном случае &nbsp; - не являются действительными сущностями XML, и именно на это жалуется Simplexml;он читает файл как xml (не html) и находит недопустимые объекты.Вам нужно сначала преобразовать HTML-сущности обратно в их символьное представление (для этого можно использовать html_entity_decode () )

$str = "some string containing html";
// this line will convert back html entities to regular characters
$str = html_entity_decode($str, ...);
// now convert special character to their xml entities
$str = str_ireplace(array('<','>','&','\'','"'),array('&lt;','&gt;','&amp;','&apos;','&quot;'),$str);

save_to_xml($str);

Обратите внимание, что если вы ранее использовали htmlentities () в своей строкесохраняя его в xml, это и является источником вашей проблемы (поскольку вы конвертируете символ html в соответствующие им объекты html, которые не распознаются симплексом как объекты xml).

// this won't work, the html entities it will uses are not valid xml entities
$str = htmlentities($str, ...)

save_to_xml($str);

Если у вас естьПроблемы с пониманием этого, думать о нем как о двух разных языках, таких как испанский (html) и английский (xml), допустимое слово в испанском () не означает, что оно также действительно в английском языке, независимо от сходства между этими двумя языками.

1 голос
/ 02 июня 2011

&nbsp;неразрывный пробел.Вы должны заменить это.http://en.wikipedia.org/wiki/Non-breaking_space

...