Проблема с simpleXML и сущностью не определяется - PullRequest
2 голосов
/ 15 сентября 2009

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

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

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

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

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

Ответы [ 5 ]

3 голосов
/ 15 сентября 2009

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

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

2 голосов
/ 15 сентября 2009

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

2 голосов
/ 15 сентября 2009

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

K

1 голос
/ 30 января 2013

Просто была очень похожая проблема и решена следующим образом. Основная идея состояла в том, чтобы загрузить файл в строку, заменить все плохие объекты на что-то вроде «[[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" на моей странице

0 голосов
/ 15 сентября 2009

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

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

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

...