- Saved searches
- Use saved searches to filter your results more quickly
- License
- BenMorel/XMLStreamer
- Name already in use
- Sign In Required
- Launching GitHub Desktop
- Launching GitHub Desktop
- Launching Xcode
- Launching Visual Studio Code
- Latest commit
- Git stats
- Files
- README.md
- About
- Павел Новицкий
- Сторонние библиотеки на основе libxml
- Сторонние библиотеки не основанные на libxml
- HTML 5
- Веб-сервисы
- Регулярные выражения
Saved searches
Use saved searches to filter your results more quickly
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session.
A PHP library to stream large XML files as DOM elements
License
BenMorel/XMLStreamer
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Name already in use
A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Sign In Required
Please sign in to use Codespaces.
Launching GitHub Desktop
If nothing happens, download GitHub Desktop and try again.
Launching GitHub Desktop
If nothing happens, download GitHub Desktop and try again.
Launching Xcode
If nothing happens, download Xcode and try again.
Launching Visual Studio Code
Your codespace will open once ready.
There was a problem preparing your codespace, please try again.
Latest commit
Git stats
Files
Failed to load latest commit information.
README.md
Stream large XML files as individual DOM elements with low memory consumption.
This library is installable via Composer:
composer require benmorel/xml-streamer
These extensions are enabled by default, and should be available in most PHP environments.
Project status & release process
This library is under development.
The current releases are numbered 0.x.y . When a non-breaking change is introduced (adding new methods, optimizing existing code, etc.), y is incremented.
When a breaking change is introduced, a new 0.x version cycle is always started.
It is therefore safe to lock your project to a given release cycle, such as 0.5.* .
If you need to upgrade to a newer release cycle, check the release history for a list of changes introduced by each further 0.x.0 version.
Let’s say you have a product feed containing a list of one million products, in the following format:
xml version="1.0" encoding="UTF-8"?> feed> products> product> id>1id> name>fooname> . product> . product> id>1000000id> name>barname> . product> products> feed>
To read it product by product, you instantiate an XMLStreamer with the path to a element:
use BenMorel\XMLStreamer\XMLStreamer; $streamer = new XMLStreamer('feed', 'products', 'product');
Any element in the document that does not match this path will be ignored.
You can then proceed to streaming the file with a generator, that will yield a DOMElement object for each :
foreach ($streamer->stream('product-feed.xml') as $product) < /** @var DOMElement $product */ echo $product->getElementsByTagName('name')->item(0)->textContent; // foo, . bar >
If you prefer to work with SimpleXML, you can use simplexml_import_dom(). SimpleXML requires that you wrap your element in a DOMDocument before importing it:
foreach ($streamer->stream('product-feed.xml') as $product) < /** @var DOMElement $product */ $document = new \DOMDocument(); $document->appendChild($product); $element = simplexml_import_dom($product); echo $element->name; // foo, . bar >
This requires the SimpleXML extension, which is enabled by default.
After all elements have been processed, the generator returns the number of streamed elements:
$products = $streamer->stream('product-feed.xml'); foreach ($products as $product) < /* . */ > $productCount = $products->getReturn();
Limiting the number of elements
If you need to get just a preview of the XML file, you can set the maximum number of elements to stream:
With this configuration, XMLStreamer would yield at most 10 elements, and ignore further entries.
The encoding of the source file is automatically read from the XML declaration:
xml version="1.0" encoding="UTF-8"?>
If your XML file is missing the encoding , you can specify it manually:
$streamer->setEncoding('ISO-8859-1');
Note that this only specifies the input file encoding. The DOMElement output is always UTF-8.
If an error occurs at any point (error opening or reading the file, malformed document), an XMLReaderException is thrown.
Note that the streaming may have already been started when the exception is thrown, so the generator may have already yielded a number of elements.
About
A PHP library to stream large XML files as DOM elements
Павел Новицкий
PHP предоставляет достаточно широкий набор доступных из коробки расширений для создания, редактирования и сохранения XML.
DOM
Расширение DOM работает с XML через DOM API. Это реализация W3C’s Document Object Model Core Level 3 — платформенно независимого интерфейса, позволяющего динамически читать и редактировать содержимое, структуру и стили документа. DOM отлично справляется с парсингом и редактированием невалидного HTML, умеет работать с XPath. Работа основана на libxml.
Для того чтобы разобраться с DOM нужно приложить усилия, но оно того стоит. DOM доступен во многих языках, поэтому велики шансы, что, перейдя на другую платформу, вы встретите уже знакомые конструкции из DOM API.
XMLReader
Расширение XMLReader — синтаксический анализатор XML. Класс-читатель выступает в качестве курсора, следует по потоку документа и останавливается на каждом узле на этом пути.
SimpleXML
Расширение SimpleXML предоставляет очень простой и легкий в использовании набор инструментов для преобразования XML в объект, с которым можно затем работать через его свойства и с помощью итераторов.
SimpleXML так же хорошо справляется с валидным XHTML кодом. При работе со всякой мешаниной готовьтесь к сюрпризам.
Сторонние библиотеки на основе libxml
phpQuery
Библиотека, работающая на стороне сервера. Основа синтаксиса и селекторов взята из jQuery. Присутствует cli интерфейс.
Zend_Dom
Компонент Zend_Dom предоставляет инструменты для работы с документами и структурами DOM. В настоящее время мы предлагается инструмент Zend_Dom_Query, который дает унифицированный интерфейс для запросов к документам DOM с использованием селекторов XPath и CSS.
QueryPath
PHP библиотека для работы с XML и HTML. Способна работать не только с локальными файлами, но и с вэб-сервисами и базами данных. Синтаксис основывается на интерфейсе jQuery селекторов, в том числе CSS селекторов. Может быть установлен через Composer.
FluentDom
Расширение DOMDocument в виде jQuery-подобного интерфейса для работы с XML. Работает через XPath, а не CSS (заявлена улучшеная производительность). Может быть установлен через Composer.
fDOMDocument
Расширяет DOMDocument. Введены исключения для обработки ошибок вместо стандартных warning и notice сообщений. Добавлены кастомные методы и сокращения для удобства и упрощения работы с DOM
Сторонние библиотеки не основанные на libxml
Основное преимущество работы с DOM/libxml — производительность и доступность прямо из коробки. Но не все библиотеки пошли этим путём. Вот некоторые из них.
SimpleHtmlDom
HTML DOM парсер, написанный на PHP5. Справляется с невалидным HTML кодом. Использует интерфейс jQuery селекторов.
Очень медленный и прожорливый инструмент. Библтиотеки на основе libxml значительно производительней.
Ganon
Универсальный парсер HTML/XML/RSS. Работа с элементами и атрибутами. Справляется с невалидным HTML. Позволяет использовать jQuery селекторы. Своя реализация аналога HTML Tidy, CSS и JS минифаера.
HTML 5
html5lib
Реализация на питоне и PHP спецификации WHATWG HTML5.
Веб-сервисы
YQL
Yahoo! Query Language (YQL) — SQL-подобный язык запросов. Работает с удалёнными ресурсами в формате HTML, XML, RSS и Atom.
ScraperWiki
Интерфейс для конвертации данных из одного формата в другой для использования на вэбе или в приложении
Регулярные выражения
Последний и наименее рекомендуемый метод работы с HTML — регулярные выражения. Большинство решений сильно зависят от конкретного случая. Малейшие изменения в разметке — лишний пробел, добавление или изменение атрибутов и регулярка уже не работает. Всегда следует подумать дважды прежде чем использовать регулярные выражения. HTML парсеры пишутся с оглядкой на HTML синтаксис. Регулярки же каждый раз придётся подстраивать под конкретную задачу.
Само собой, не проблема написать рабочий парсер на регулярных выражениях, но зачем тратить время и силы на то что уже давно реализовано в других библиотеках.