Является ли XMLReader парсером SAX, парсером DOM или ни тем, ни другим? - PullRequest
3 голосов
/ 15 июня 2010

Я тестирую различные методы чтения (возможно, больших, с очень частым чтением) файлов конфигурации XML в PHP. Не нужно писать. У меня есть две успешные реализации, одна с использованием SimpleXML (я знаю, что это анализатор DOM) и одна с использованием XMLReader .

Я знаю, что читатель DOM должен читать все дерево и поэтому использует больше памяти. Мои тесты отражают это. Я также знаю, что парсер SAX - это парсер, основанный на событиях, который использует меньше памяти, потому что он читает каждый узел из потока, не проверяя, что будет дальше.

XMLReader также читает из потока с курсором, предоставляя данные об узле, в котором он находится в данный момент. Итак, это определенно звучит как XMLReader (http://us2.php.net/xmlreader) - это , а не - анализатор DOM, но у меня вопрос: это SAX-анализатор или что-то еще? Кажется, XMLReader ведет себя так же, как SAX анализатор выполняет, но не генерирует сами события (другими словами, вы можете создать SAX-анализатор с XMLReader?)

Если это что-то еще, имеет ли классификация название?

Ответы [ 4 ]

5 голосов
/ 15 июня 2010

XMLReader называет себя "синтаксическим анализатором".

Расширение XMLReader является синтаксическим анализатором XML Pull. Читатель действует как курсор, идущий вперед по потоку документов и останавливающийся на каждом узле в пути.

Позже он говорит, что использует libxml .

Эта страница по синтаксическому анализу Java XML Pull может представлять интерес. Если XMLReader связан с целями и задачами этого проекта, то ответ на ваш вопрос прямо попадает в категорию «ни».

4 голосов
/ 15 июня 2010

SAX-парсер - это парсер, который реализует SAX API.То есть: данный парсер является SAX-парсером тогда и только тогда, когда вы можете кодировать его с помощью SAX API.То же самое для парсера DOM: эта классификация основана исключительно на API, который она поддерживает, а не на том, как реализован этот API.Таким образом, SAX-парсер вполне может быть и DOM-парсером;и, следовательно, вы не можете быть настолько уверены в использовании меньшего количества памяти или других характеристик.

Однако, чтобы перейти к реальному вопросу: XMLReader кажется лучшим выбором, потому что, поскольку это парсер, вы запрашиваете данные, которые вам нужны, совершенно определенноследовательно, должно быть меньше накладных расходов.

1 голос
/ 12 февраля 2013

Короче говоря, это ни то, ни другое.

SAX-парсеры ориентированы на поток и основаны на событиях.Вы регистрируете функции обратного вызова для обработки таких событий, как startElement и endElement, а затем вызываете parse () для обработки всего документа XML, по одному узлу за раз.Насколько мне известно, PHP не имеет хорошо поддерживаемого парсера SAX.Однако существует XMLParser , который использует очень похожую библиотеку Expat .

DOM-анализаторы требуют загрузки всего XML-документа в память, но они предоставляют объект-ориентированное дерево узлов XML.Примеры синтаксических анализаторов DOM в PHP включают SimpleXML и DOM .

PHP XMLReader не относится ни к одному из них.Это ориентированный на поток «синтаксический анализатор», который требует от вас создания большого цикла и вызова функции read () для перемещения курсора вперед, обрабатывая один узел за раз.

Большое преимущество XMLParser иXMLReader против SimpleXML и DOM заключается в том, что потоково-ориентированные синтаксические анализаторы эффективно используют память, загружая в память только текущий узел.С другой стороны, SimpleXML и DOM проще в использовании, но они требуют загрузки всего XML-документа в память, а это очень плохо для очень больших XML-документов.

1 голос
/ 31 октября 2011

XMLReader - это интерфейс, который должен реализовывать анализатор SAX2. Таким образом, вы можете сказать, что у вас есть SAX-парсер, когда вы получаете к нему доступ через XMLReader, и для краткости, XMLReader - это SAX-парсер.

См. Javadoc XMLReader .

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

Я думаю, что эта информация актуальна, потому что:

  • взято с официального сайта SAX
  • Даже если javadoc предназначен для Java, SAX возникла на языке Java.
...