MiniXml (php) не может проанализировать файлы размером более 100 КБ - PullRequest
0 голосов
/ 30 марта 2009

Я извлекаю XML из веб-службы и затем загружаю его в MiniXml (PHP). Когда файл меньше, чем 100 КБ, он разбирается просто отлично. Больше, и я получаю ошибку:

Вызов функции-члена getElement () для необъекта

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

$parsedDoc = new MiniXMLDoc();
$parsedDoc->fromString($xml);
$root =& $parsedDoc->getElement('my-root-element');
$lists =& $root->getElement($type);

Веб-сервис, который я вызываю, позволяет мне указать количество элементов верхнего уровня для вызова. Последний элемент, размер которого превышает 100 КБ, правильно сформирован и не имеет никаких проблем. Единственное, о чем я могу думать, это размер. В этом случае имеет значение размер?

Обновление: Я считаю, что это проблема с буфером, но я не знаю, какой буфер вызывает проблему. Я уверен, что это не «вызов веб-службы», потому что я знаю, что он извлекает все данные. Является ли буфер PHP или MiniXml буфером, который вызывает проблему? Или это что-то совсем другое? (Спасибо Дэн за то, что указал на это)

Ответы [ 2 ]

6 голосов
/ 30 марта 2009

Я сталкивался с тем же, о чем говорил при преобразовании HTML в PDF .

Эта ошибка описывает проблему. В PHP 5.2.x появился новый параметр pcre.backtrack_limit , который по умолчанию имеет значение 100 000. По сути, любая функция preg_ * будет молча завершаться сбоем в строках размером более 100 КБ, начиная с PHP 5.2 . Кстати, сообщение об ошибке остается открытым. С этим ничего не было сделано.

Предел слишком низкий. Если у вас есть возможность поднять его до 2 000 000 (или что вам нужно). Если это не вариант, которого может не быть в среде общего хостинга, то у вас проблемы.

Я действительно не мог поверить этому, когда нашел это. Мало того, что это изменение сломало кучу шаблонного кода (как засвидетельствуют многие потоки, отчеты об ошибках и комментарии по всем вышеперечисленным), но не возникло никакой ошибки (если только вы случайно не взглянули на preg_last_error (), с которой сталкиваемся, большинство людей нет).

0 голосов
/ 30 марта 2009

Я мало знаю о php и ничего о MiniXml, но на ум приходит то, что, возможно, у вас есть входной буфер размером <= 100K, и поэтому, когда он подается в MiniXML, тег закрытия отсутствует в элемент верхнего уровня в документе. (Это будет отличаться от вопроса о том, является ли <strong>последний элемент, который вы цитировали, хорошо сформированным.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...