Проблема с simpleXML и сущностью не определена

Я пытаюсь разобрать XML-файл, но при загрузке simpleXML выводит следующее предупреждение:

Предупреждение: simplexml_load_file () [function.simplexml-load-file]: gpr_545.xml: 55: ошибка парсера: объект «Oslash» не определен в import.php в строке 35

Это та строка:

<forenames>B&Oslash;IE</forenames><x> </x> 

Поскольку это предупреждение, я мог бы игнорировать его, но я хотел бы понять, что происходит.

HTML Кодирование символов Latin1 (например, Ø, что описывает этот символ) – это то, что нарушило синтаксический анализатор XML. Если вы контролируете данные, вам нужно избежать этого, используя кодировку символов в стиле XML (Ø просто происходит & # 216;)

HTML-объекты, подобные & Oslash, не совпадают с XML-объектами. Вот таблица для замены HTML-объектов на XML-объекты.

Как я могу сказать из одного из ваших комментариев на другой пост, у вас возникают проблемы с сущностью & sol ;. Я не знаю, является ли это даже допустимым HTML-сущностью, мой Firefox не отображает символ – только выдает имя сущности. Но я нашел другую таблицу для большинства объектов и их ссылочный номер. Попробуйте добавить их в таблицу замещения, и вы должны быть в безопасности. & sol. 's ссылочный номер / кстати.

Я думаю, что это проблема кодирования. php, simplexml в этом конкретном случае, не нравится датский O, который у вас есть в теге fornames. Вы можете попытаться закодировать весь файл в utf-8 и удалить эту версию из тега. Aferwards вы можете прочитать файл с неограниченным доступом без символов в simplexml.

К

Просто была очень похожая проблема и решена ее следующим образом. Основная идея заключалась в том, чтобы загрузить файл в строку, заменить все плохие объекты на что-то вроде «[[entity]] Oslash;» и выполнить обратную замену перед отображением некоторого узла xml.

 function readXML($filename){ $xml_string = implode("", file($filename)); $xml_string = str_replace("&", "[[entity]]", $xml_string); return simplexml_load_string($xml_string); } function xml2str($xml){ $str = str_replace("[[entity]]", "&", (string)$xml); $str = iconv("UTF-8", "WINDOWS-1251", $str); return $str; } $xml = readXML($filename); echo xml2str($xml->forenames); 

iconv («UTF-8», «WINDOWS-1251», $ str), поскольку у меня есть кодировка «WINDOWS-1251» на моей странице

Попробуйте использовать эту строку:

 <forenames><![CDATA[B&Oslash;IE]]></forenames><x> </x> 

и прочитайте это о CDATA