Ошибка при парсинге XML-файла.

val_basket

Guest
Ошибка при парсинге XML-файла.

Доброго времени суток!

Если можно, объясните, пожалуйста, как обойти такую проблему.

Есть XML-файл. Довольно маленький (примерно 640К). Все, что он содержит - это тэги с инфой о товарах, которые надо тупо вставлять в MySQL. Примерно 650 записей по 20 полей на каждую. Задача тривиальная. Но! На определенном этапе скрипт вылетает с ошибкой:
PHP Fatal error: Allowed memory size of 8388608 bytes exhausted (tried to allocate 45 bytes) in /www/.../functions.php on line NNN

Т.е. провайдер ограничивает данные 8МБ. Но как файл в 640КБ может занять 8МБ? Т.е. мой скрипт записывает примерно 340 записей в БД, а потом обрывается :-( Подскажите, пожалуйста, можно ли это как-то обойти?

Заранее спасибо.
 

[DAN]

Старожил PHPClub
Скорее всего файл парсится с использованием dom-функций.
Дело в том, что объектная модель документа занимает в памяти гораздо больше места, чем сам документ.
Вариантов решения проблемы два:
1) Разбивать исходный документ на несколько более меньших по объему данных. Это решение "влоб".
2) Более "правильный" вариант - смена API. То есть использование SAX-модели для обработки документа.
 

val_basket

Guest
Да, использую dom-функции... Т.к. с XML-ем сталкиваюсь крайне редко, других попросту не знаю :-(

Если не сложно, подскажите, где можно почитать что-то типа "SAX для чайников" ;-)
 

slach

Новичок
в мануале читать надо начиная с
http://php.net/manual/en/ref.xml.php
 

val_basket

Guest
Спасибо всем огромное!
Более-менее разобрался. Этого хватило для решения задачи :)

Только еще один вопрос:
Код получился такой:
==========================
$xml_parser = xml_parser_create();
xml_set_element_handler($xml_parser, "startElement", "endElement");
xml_set_character_data_handler($xml_parser, "textData");
$xml = file_get_contents($file);
if(!xml_parse($xml_parser, $xml))
{
// Сообщение об ошибке
}
xml_parser_free($xml_parser);
==========================
И если в структуре документа где-то появляется ошибка, то он ее выдает только когда до нее дойдет. Можно ли как-то заранее проверить, что документ без ошибок и только после этого его парсить?
 

slach

Новичок
;))) почитай пожалуйста чем отличаются
valid документы
от well-formed

для того чтобы узнать является ли документ well-formed надо его прочитать ВЕСЬ... в любом случае и распарсить хотя бы через SAX

для того, чтобы проверить является ли документ valid, используются инструменты валидации вроде DTD и XMLSchema
 

val_basket

Guest
Ага, понЯл...
Еще раз всем спасибо. Надеюсь не сильно насмешил вопросами ;-) Просто, правда, с XML-ем ОЧЕНЬ редко сталкиваюсь...
 

slach

Новичок
;) нормальные вопросы повторяющиеся периодически у всех
но по крайней мере ты вменяемый
 
Сверху