Ошибка Huge input lookup при парсинге xml
Из всего вразумительного, что нашлось в гугле по данной ошибке это вот это сообщение:
Я заменил свой код
$xml = simplexml_load_string(file_get_contents($filename));
на
$xml = simplexml_load_string(file_get_contents($filename), 'SimpleXMLElement', LIBXML_COMPACT | LIBXML_PARSEHUGE);
но это не помогает.
Вообще ситуация странная ибо ошибка проявляется странно, а именно: xml, который приходит - в одну строку и при парсинге libxml_get_errors() возвращает мне "Huge input lookup, строка 1, столбец 7894566". В данном случае столбец - это символ. Я нахожу этот символ (в нём нет ничего криминального) и перед тегом, в котором этот символ используется ставлю конец строки (энтер), а также после закрывающего тега тоже ставлю конец строки. Итого у меня получается файл в 3 строки:
- строка до тега, который содержит "проблемный" символ,
- строка, в которой открывающий тег, текст, содержащий "проблемный" символ и закрывающий тег
- остальная часть файла в одну строку
Пример:
...<offer id="43081" bid="11" available="true"><priceBase>167.6</priceBase><price>358.94</price><currencyId>UAH</currencyId>
<categoryId>000015</categoryId>
<Pack1>1</Pack1><Pack2>0</Pack2><delivery>false</delivery><local_delivery_cost>0</local_delivery_cost><name>Ручк...
Сохраняю, парсю. "Проблемный" символ уже становится не проблемный, а проблема находится в третьей строке. С третьей строкой я делаю всё тоже самое, что описал выше и опять проблема находится ещё дальше, т.е. в той части файла, которая осталась после переносов строк в нём.
Т.е. тыкая обрывы строк между ...><... я "отодвигаю" проблемный символ на конец файла. Очевидно, что проблема в данном случае не в конкретном символе.
Однако, когда я добрался до последнего товара и "проблемный" символ был найден в нём, я проставил обрывы строк между всеми тегами этого товара. Получил вполне нормальный вид
<offer id="412081" bid="13" available="true">
<priceBase>1167.6</priceBase>
<price>758.94</price>
<currencyId>UAH</currencyId>
<categoryId>000015</categoryId>
<Pack1>1</Pack1>
<Pack2>0</Pack2>
<Pack3>1</Pack3>
<delivery>false</delivery>
<local_delivery_cost>0</local_delivery_cost>
<name>Ручка шар/масл "GLYCER+&ampquot дисплей-бокс, 244 шт микс цветов 0,7 мм &ampquotLINC"</name>
<vendor>LINC</vendor>
<description>Ручки Linc известны во всем мире качеством и долговечностью. Шарико-масляные чернила дают насыщенное письмо даже при минимальном нажиме, а ударопрочный пластик сохраняет ручку целой при падении. Игольчатый пишущий узел делает записи более аккуратными. Linc – это мягкое и чистое письмо ручкой. Без надавливания и усилий.</description>
<barcode>8906081050540</barcode>
<country_of_origin>Iндiя</country_of_origin>
</offer>
Получаю всё ту же ошибку. Она ругается на 17 символ в строке < description>. В данном случае это буква "к". Я не вижу ничего кримиинального в этом коде. Я тупо удаляю строку с тегом < description>...</ description> и парсинг проходит нормально.
Соответственно вопрос: в чём суть ошибки и как её побороть?
Ответы (1 шт):
Заменил функцию simplexml_load_string() на simplexml_load_file(). Работает.
Скорее всего при получении строки из большого файла функции simplexml_load_string() не хватает памяти или что-то в этом духе. Поэтому получаем объект xml не из строки, а тупо из файла функцией simplexml_load_file().