PHP XMLReader проблема с htmlentities - PullRequest
       7

PHP XMLReader проблема с htmlentities

3 голосов
/ 01 сентября 2011

Я обрабатываю внешний XML-документ, используя метод, описанный здесь ( Как использовать XMLReader в PHP? ), но я сталкиваюсь с этой ошибкой:

...parser error: сущность 'Atilde' не определена в ...

и аналогичных файлах, например

cent, acirc, а не

Ошибка возникает в функции $ z-> expand ().Если я это закомментирую, то это происходит с функцией $ z-> next ().

Я знаю проблемное поле и пытался отредактировать его с помощью base64_encode перед расширением, но оно доступно только для чтения.

РЕДАКТИРОВАТЬ: строка проблемы:

...ââ¬Â...

конец редактирования

Спасибо за любую помощь.

Ответы [ 4 ]

2 голосов
/ 01 сентября 2011

XML знает только сущности lt , gt , amp , apos и quot . Таким образом, любая другая ссылка на сущность вызовет ошибку.(Обратите внимание, что ссылки на символы и ссылки на сущности не совпадают.)

Вы можете использовать strtr для преобразования любой ссылки на сущность HTML, которая также не известна вXML:

$trans = array_map('utf8_encode', array_flip(array_diff(get_html_translation_table(HTML_ENTITIES), get_html_translation_table(HTML_SPECIALCHARS))));
$output = strtr($input, $trans);

get_html_translation_table возвращает массив для сопоставления символа со ссылкой на сущность.get_html_translation_table(HTML_ENTITIES) возвращает отображение для всех сущностей, а get_html_translation_table(HTML_SPECIALCHARS) возвращает только те, которые упомянуты выше.array_diff даст разницу, поэтому все сущности без упомянутых выше.array_flip инвертирует связь ключ / значение, и применение array_map с utf8_encode преобразует значения из ISO 8859-1 в UTF-8.

1 голос
/ 14 апреля 2014

Возможно, xml_set_external_entity_ref_handler - решение для вашего случая:

http://php.net/manual/en/example.xml-external-entity.php

http://www.php.net/manual/en/function.xml-set-external-entity-ref-handler.php

0 голосов
/ 13 ноября 2015

Это недостаток в оригинальном XML, но это не редкость.Мне не очень повезло с решениями здесь (кроме Вута ван дер Вегта), поэтому вот подход «создай новый XML, который исправлен»:

// Needs PHP 5.4.0+

$file = "xmldata_with_entities.xml";
$file2 = "xmldata_converted.xml";

$handle1 = fopen($file, "r");
$handle2 = fopen($file2, "w");
if ($handle1) {
    while (($line = fgets($handle1)) !== false) {
        fwrite($handle2, html_entity_decode($line,ENT_HTML5));
    }
}
fclose($handle1);
fclose($handle2);

Очевидно, что тогда вы могли бы использовать $ file2в XMLReader.

0 голосов
/ 26 апреля 2012

Обнаружена та же проблема.

Мое решение состояло в том, чтобы открыть файл XML в notepad ++, выполнить поиск и заменить символы на читаемые.

Не красивое решение, но оно работает;)

...