Как мне устранить «ошибку синтаксического анализатора simplexml_load_file (): объект ‘nbsp’ не определен»?

#php #xml #symbols

#php #xml #символы

Вопрос:

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

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

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

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

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

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

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

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

1. amp;nbsp; по умолчанию не определен в XML. Может быть, достаточно просто заменить его пробелом?

2. Вы говорите, что используете PHP для генерации XML-файлов; что вы используете? Если вы используете правильный инструмент, он должен позаботиться об этих объектах за вас…

Ответ №1:

Специфичные для HTML объекты — в данном случае amp;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('<','>','amp;',''','"'),array('amp;<','amp;>','amp;amp;','amp;apos;','amp;quot;'),$str);

save_to_xml($str);
  

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

Ответ №2:

amp;nbsp; является объектом HTML, но не существует в XML.

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

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

1. итак, если я использую CDATA, должен ли я все еще использовать str_ireplace ? Спасибо.

2. @cj333 нет, вы не должны использовать str_ireplace

Ответ №3:

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

Ответ №4:

Вы также можете использовать htmlentities($str, ENT_XML1 | ENT_QUOTES) (htmlentities), которые используют только объекты XML, а не HTML (например, amp;nbsp , amp;ndash amp;laquo , amp;raquo , и т.д.)