Задать вопрос

PHP: работа с XML

Привет всем хабравчанам. Возник такой вопрос: как в PHP грамотней всего работать с XML? Интересует как просто обмен запросами (отправил XML запрос, получил ответ, обработал) так и обработка больших XML файлов (~800мб). Желательно что бы скрипт не сильно зависел от настроек php и установленных библиотек.
Буду очень благодарен за примеры кода.
  • Вопрос задан
  • 34762 просмотра
Подписаться 15 Оценить 1 комментарий
Пригласить эксперта
Ответы на вопрос 7
Melkij
@Melkij
PostgreSQL DBA
SimpleXML.
В ядре по-умолчанию.
Ответ написан
Комментировать
@Melz
Для больших файлов только pull-парсеры. SimpleXML на сколько я помню загружает всю структуру в память, да не особо эффективно. Минусы: приходится самому следать за вещами.

Так что или SAX Parser (http://se.php.net/xml) или XMLReader (http://se.php.net/manual/en/book.xmlreader.php)
Кстати, хорошо работает комбинированный подход: ищем место XMLReaderом и потом результат заргужаем в SimpleXML и работаем с ним как нормальные люди.

Сделайте тест, даже на 10Мб скорость будет заметна. Попробуйте загрузить даже такой файл в разные парсеры и офигейте от раздницы во времени работы и использовании памяти :)
Ответ написан
Комментировать
Хотелось бы подробнее задачу: какая структура документа, насколько часто будет выполнятся, какой сервер, какие ресурсы вы готовы задействовать?

Как уже сказали SimpleXML, DOM или SAX индексируют все в память и 800 МБ — это не мало. Хотя на сервере с несколькими гигабайтами оперативки и при нечастом запросе данного функционала я бы так сделал и не мучился, в любом случае обработка 800 МБ — это не простая операция.

Есть куча парсеров, которые ничего не индексируют, а проходятся по файлу регулярками, я пробовал использовать XMLReader, но у меня он очень сильно тормозит, даже после оптимизации и загрузки кусков в SimpleXML, этот вариант в продакшин так и не пошел.

В итоге я написал свой парсер, который читал файлы последовательно, посимвольно, создавая блоки непосредственно «итемов» которые уже грузил в SimpleXML и затем обрабатывал. Я считаю этот вариант единственный рабочий для больших файлов, а инструменты вроде XMLReader для очень узких задач, хотя не исключаю, что я «просто не умею их готовить».

Такой мой опыт, абсолютно не претендую на полноту знаний, но это реально работающий вариант.
Ответ написан
Конешн SimpleXML. Вот простой примерчик.
<?php
$xml = simplexml_load_file("file.xml");
foreach ($xml->items as $item) {
echo $item->name;
echo $item->price;
}

?>
Ответ написан
я писал подобный класс: dpyatkov.ru/2012/01/12/simplexmlreader/ — симбиоз simplexml и xmlreader, может пригодится.
Ответ написан
С генерацией думаю проблем нет, а вот с парсингом — для мелких XML (запрос/ответ) использую Simplexml (simplexml_load_string() ), полученый в результате объект бывает потом удобно преобразовать в ассоциативный массив. Для крупных XML — xml_parse().
Ответ написан
Комментировать
knekrasov
@knekrasov
Посмотрите на SimpleXML
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы