Я тестирую различные методы для чтения (возможно, большого, с очень часто читаемыми) файлов конфигурации XML в PHP. Никакой письменности никогда не требуется. У меня есть две успешные реализации, одна из которых использует SimpleXML (который я знаю – DOM-парсер), а другой – с помощью XMLReader .
Я знаю, что читатель DOM должен читать все дерево и поэтому использует больше памяти. Мои тесты отражают это. Я также знаю, что парсер SAX является парсером, основанным на событиях, который использует меньше памяти, потому что он считывает каждый узел из потока, не проверяя, что будет дальше.
XMLReader также считывает из потока с курсором, который предоставляет данные об узле, в котором он сейчас находится. Итак, это определенно звучит так, как XMLReader ( http://us2.php.net/xmlreader ) не является парсером DOM, но, на мой вопрос, это SAX-парсер или что-то еще? Кажется, что XMLReader ведет себя так, как делает SAX-парсер, но не бросает сами события (другими словами, вы можете построить SAX-парсер с XMLReader?)
Если это что-то еще, есть ли у классификации, в которой она находится, имя?
XMLReader называет себя «синтаксическим анализатором».
Расширение XMLReader является парсером XML Pull. Читатель действует как курсор, идущий вперед по потоку документа и останавливаясь на каждом узле по пути.
Позже он продолжает говорить, что использует libxml .
Эта страница на Java XML Pull Parsing может представлять интерес. Если XMLReader связан с целями и задачами этого проекта, тогда ответ на ваш вопрос попадает прямо в категорию «ни».
SAX-парсер – это синтаксический анализатор, который реализует SAX API. То есть: данный анализатор является SAX-парсером тогда и только тогда, когда вы можете использовать код SAX API для него. То же самое для анализатора DOM: эта классификация касается только API, который он поддерживает, а не того, как этот API реализован. Таким образом, синтаксический анализатор SAX вполне может быть парсером DOM; и, следовательно, вы не можете быть уверены в том, что используете меньше памяти или другие характеристики.
Однако, чтобы понять реальный вопрос: XMLReader кажется лучшим выбором, потому что, поскольку он является парсером для вытягивания, вы запрашиваете нужные данные, и вы должны иметь меньше накладных расходов.
XMLReader
– это интерфейс, который должен реализовывать анализатор SAX2. Таким образом, вы можете сказать, что у вас есть синтаксический анализатор SAX при доступе к нему через XMLReader
и, короче говоря, XMLReader
является SAX-парсером.
См. Javadoc XMLReader .
XMLReader – это интерфейс, который должен реализовать драйвер SAX2 для парсера XML. Этот интерфейс позволяет приложению устанавливать и запрашивать функции и свойства в синтаксическом анализаторе, регистрировать обработчики событий для обработки документов и инициировать анализ документа.
Я думаю, что эта информация актуальна, потому что:
Короче говоря, это не так.
Анализаторы SAX представляют собой потоковые парсеры, ориентированные на поток. Вы регистрируете функции обратного вызова для обработки таких событий, как startElement и endElement, затем вызываете parse () для обработки всего XML-документа, по одному узлу за раз. Насколько мне известно, PHP не имеет хорошо хранимого анализатора SAX. Однако есть XMLParser , который использует очень похожую библиотеку Expat .
DOM-парсерам требуется загрузить весь XML-документ в память, но они предоставляют объектно-ориентированное дерево узлов XML. Примеры парсов DOM в PHP включают SimpleXML и DOM .
PHP XMLReader не является ни тем, ни другим. Это потоковый парсер, ориентированный на поток, который требует создания большого цикла и вызова функции read () для перемещения курсора вперед, обработки одного узла за раз.
Большое преимущество XMLParser и XMLReader vs SimpleXML и DOM заключается в том, что поточно-ориентированные синтаксические анализаторы эффективно работают с памятью, загружая только текущий узел в память. С другой стороны, SimpleXML и DOM проще в использовании, но им требуется загрузить весь XML-документ в память, и это плохо для очень больших XML-документов.