Чем распарсить большой XML?

eugef

Новичок
Чем распарсить большой XML?

Есть большой XML файл (1мб и более) котрый нужно распарсить и залить в бд. Сейчас пользуюсь PHP 4.3.1 и библиотеку MiniXml, однако на таком большом файле она вешает Apache!
Что делать?

- Использовать другую библиотеку с поддержкой DOM (подскажите какую)?
- Использовать XML-parser (который на библиотеке Expat и родной для PHP 4.3)?
- Перейти на PHP 5 где встроена полноценная поддержка DOM?

Что посоветуете?
 

dimgel

Новичок
Re: Чем распарсить большой XML?

Пользуй XML-parser - он, в отличие от DOM (в т.ч. полноценного), не загружает весь документ в память.
 

slach

Новичок
eugef
БОЛЬШИЕ файлы парсятся с помощью SAX парсера
http://php.net/manual/en/ref.xml.php
посмотри коментарии и примеры на функцию xml_parse()

если есть возможность перейти на php5.1.2
то переходи и используй интерфейс XMLReader
http://php.net/manual/en/ref.xmlreader.php

DOM как тебе правильно сказали, не используй
сожрешь всю память
 

eugef

Новичок
Ок, спасибо за советы - буду использовать SAX-парсер.

И еще такой вопрос - подскажите библиотеку для PHP 4.3 с полноценной поддержкой DOM.
Все таки надо и на сервере формировать XML
 

dub

Новичок
eugef
зачем тебе дом для формирования xml на сервере?
http://pecl.php.net/package/xmlwriter - работает однозначно быстрее. Правда не удобно работать с сильно разветвленной динамической структурой, но если тебе просто нада формировать xml стандартного типа, то это вариант... Еще плюс, работает с гораздо большими файлами.
 

nut

Новичок
простите люди начинающего xlm-щика, но нельзя ли прочитать xlm SimpleXML используя XPath.
Если XPath запросом выделить нужные части xml?
Или SimpleXML все равно весь файл сгружает в память?
 

dimgel

Новичок
XPath использует DOM (который грузит весь документ в память). SimpleXML тут не катит (и весь документ не грузит, а читает последовательно, распознавая только синтаксические конструкции и не сохраняя никакой информации по структуре).

Сам посуди: если ты, например, запрашиваешь nodeset по XPath-выражению "/goods/row[price < 100]" (типа, выбрать все товары дешевле $100), и при этом у тебя в XML дорогих товаров нет, то XPath должен вернуть ВСЕ элементы row, а для этого он должен их все просканировать, а для этого они все должны быть уже в памяти.
 

Alexandre

PHPПенсионер
использовать xml_reader из pecl (только для пятерки)
вариант 2 - использовать командный режим РНР (все это запустить в фоновом режиме).
вариант 3 - написать программу разбора на С и опять же все это запустить в фоновом режиме, а еще лучше - ночью по крону.

-~{}~ 12.04.06 17:43:

dub для информации
xmlReader Provides fast, non-cached, forward-only access to XML data under PHP 5.

xmlwriter Provides fast, non-cached, forward-only means to write XML data
to write - ну ни как тут не распарсишь, хоть убейся...

-~{}~ 12.04.06 17:48:

eugef, знаю людей - которые парсили 17 мегЮ так что 1 мег - это не предел
 

dub

Новичок
Alexandre
да наверное ты прав, я то использовал только под php5.
меня просто смутили зависимости
PHP Version: PHP 4.3.0 or newer
PEAR Package: PEAR Installer 1.4.0a2 or newer
подумал что должно и в php > 4.3 работать.
к слову xmlReader, xmlWriter - нормально читали/писали файлы по 100 Mb. , а к примеру 37 - ми меговый файл dom-мом у меня никак не получилось обработать, все почемуто висло. (celeron2.4, 512, sata диск). И сьедало всю оперативку. Да xmlWriter предназначен просто для создания xml файлов. заданной структуры. механизмов работы с деревом он естесвенно не имеет. Это всего лиш простой и быстрый способ создавать xml.
 

eugef

Новичок
dub,
насколько я понял XMLWriter использует библиотеку libxml, которая в стандартную поставку php 4.3 не входит - ее надо ставить отдельно, что на многих хостингах делать не дают - поэтому нужны функции для создания xml, не использующие посторонних библиотек!


Alexandre,
XMLReader только под php 5 работает (и тоже libxml использует) - неужели для php 4.3 только SAX доступен?

-~{}~ 13.04.06 17:52:

Нашел просто офигенную библиотеку для парсинга XML основанную на SAX - DOMIT (http://www.engageinteractive.com/mambo/index.php?option=content&task=view&id=3606&Itemid=25279), подходит для php 4 и 5!

Кроме парсинга SAXом она позволяет еще и создавать документы XML!
 

Alexandre

PHPПенсионер
v 1.0
Use PHP streams under PHP 4
Add xmlwriter_flush function to flush buffer
Add support for xmlTextWriterStart/EndComment
возможно с 4й версией и работает... признаюсь не проверял.
This extension wraps the libxml xmlWriter API
это значить, что помимо DOM, libxml содержит еще и xmlWriter API, впрочем как и msxml.dll
см http://mail.gnome.org/archives/xml/2003-October/msg00246.html
Cool, looks like you wrote it to be more conform the original .net xmlwriter too
-~{}~ 13.04.06 19:21:

Нашел просто офигенную библиотеку для парсинга XML основанную на SAX - DOMIT
ну для начала
Expat is a C-based SAX parser written by James Clark that comes bundled with most later distributions of PHP.

SAXY is a pure PHP SAX parser written by Engage Interactive that comes bundled with DOMIT!
Expat - это и есть тот же SAX http://php.rinet.ru/manual/en/ref.xml.php
следовательно - это лишняя обертка которая будет обрабатывать твой большой XML
 

eugef

Новичок
Alexandre
Expat - это и есть тот же SAX http://php.rinet.ru/manual/en/ref.xml.php
следовательно - это лишняя обертка которая будет обрабатывать твой большой XML
Согласен, но использовать ее удобнее чем напрямую Expat, да и скорость работы меня более чем устраивает!
 

eugef

Новичок
Alexandre
Используя DOMITlight и Expat я распарсил 1мб за 2,5 секунды, это нормальная скорость?
 

Wicked

Новичок
DOMIT! - отдельная история :)
он, например, не умеет сам себя удалять из памяти :) и остается висеть в памяти благодаря кросс-референсам ( http://www.engageinteractive.com/forums/viewtopic.php?t=96 ). С того момента он не обновлялся.
 

tug

Новичок
Нужно универсальное решение (и на 4 и на 5), чтобы писать много информации из БД по известной структуре в XML по запросу пользователя.
DOMIT! сжирает всю память.
 

tug

Новичок
Ну это как-то по ламерски, я бы сказал =)
Ещё скажите, что для того чтобы структурированность показать нужно \n и \t юзать, а атрибуты с других запросов через str_replace делать =)

Хочется чтобы оно символы само конвертило, чтобы код читаемый был...
 
Сверху