Ошибка 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 строки:

  1. строка до тега, который содержит "проблемный" символ,
  2. строка, в которой открывающий тег, текст, содержащий "проблемный" символ и закрывающий тег
  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>Ручка шар/масл &quotGLYCER+&amp;ampquot дисплей-бокс, 244 шт микс  цветов 0,7 мм &amp;ampquotLINC&quot</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 шт):

Автор решения: Oughtem

Заменил функцию simplexml_load_string() на simplexml_load_file(). Работает.

Скорее всего при получении строки из большого файла функции simplexml_load_string() не хватает памяти или что-то в этом духе. Поэтому получаем объект xml не из строки, а тупо из файла функцией simplexml_load_file().

→ Ссылка