#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
, и т.д.)