В чем разница между SAX и DOM?


Я читал некоторые статьи о XML Парсеры и наткнулся на SAX и DOM.

SAX событие и DOM - это модель дерева-я не понимаю различия между этими понятиями.

из того, что я понял, на основе событий означает, что какое-то событие происходит с узлом. Например, когда вы нажимаете на определенный узел, он будет давать все подузлы, а не загружать все узлы в то же время. Но в случае DOM разбор он будет загружать все узлы и сделать модель дерева.

правильно ли я понимаю?

пожалуйста, поправьте меня, если я ошибаюсь, или объясните мне модель на основе событий и дерева более простым способом.

10 215

10 ответов:

Ну, вы близки.

в SAX события запускаются, когда XML находится парсится. Когда синтаксический анализатор анализирует XML и встречает запуск тега (например,<something>), то это вызывает tagStarted событие (фактическое имя события может отличаться). Аналогично, когда конец тега встречается при разборе (</something>), то триггеры tagEnded. Использование синтаксического анализатора SAX подразумевает, что вам нужно обрабатывать эти события и понимать данные, возвращаемые с каждым событие.

в DOM нет событий, инициируемых при разборе. Весь XML анализируется и создается и возвращается дерево DOM (узлов в XML). После анализа пользователь может перемещаться по дереву для доступа к различным данным, ранее внедренным в различные узлы XML.

В общем, DOM проще в использовании, но имеет накладные расходы на разбор всего XML, прежде чем вы сможете начать его использовать.

в нескольких словах...

Сакс (S imple AПИ XML): это потоковый процессор. У вас есть только крошечная часть в памяти в любое время, и вы "нюхаете" поток XML, реализуя код обратного вызова для таких событий, как tagStarted() etc. Он почти не использует память, но вы не можете делать вещи "DOM", такие как использование xpath или траверс деревьев.

DOM (Document Object Model): вы загружаете все это в память - это массивный боров памяти. Вы можете взорвать память даже с документами среднего размера. Но вы можете использовать xpath и пересечь дерево и т. д.

здесь проще говоря:

DOM

  • анализатор модели дерева (на основе Объекта) (дерево узлов).

  • DOM загружает файл в память, а затем анализирует - файл.

  • имеет ограничения памяти, так как он загружает весь XML-файл перед разбором.

  • DOM читается и записывается (можно вставлять или удалять узлы).

  • Если содержимое XML маленький, то предпочитают DOM парсер.

  • назад и вперед поиск возможен для поиска тегов и оценки информация внутри тегов. Так что это дает простоту навигации.

  • медленнее во время выполнения.

Сакс

  • парсер на основе событий (последовательность событий).

  • SAX анализирует файл по мере его чтения, т. е. анализирует узел по узел.

  • нет ограничений памяти, так как он не хранит содержимое XML в памяти.

  • SAX только для чтения, т. е. не может вставить или удалить узел.

  • используйте Sax parser, когда объем памяти большой.

  • SAX считывает XML-файл сверху вниз, и обратная навигация невозможна.

  • быстрее во время выполнения.

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

подход DOM обычно используется для небольших XML структуры (где маленький зависит от того, сколько лошадиных сил и памяти имеет ваша платформа), которые могут потребоваться изменить и запросить по-разному после их загрузки.

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

то, что он в основном делает, - это чтение входных данных сверху и вызов методов обратного вызова, которые вы предоставляете, когда происходят определенные "события". Событие может попасть в открывающий тег, атрибут в теге, найти текст внутри элемента или встретить конечный тег.

SAX упрямо читает ввод и говорит вам, что он видит таким образом. Это до вас, чтобы сохранить всю информацию о состоянии вам требуется. Обычно это означает, что вы создадите какой-то вид государственная машина.

хотя этот подход к обработке XML намного более утомителен, он также может быть очень мощным. Представьте, что вы хотите просто извлечь заголовки новостных статей из ленты блога. Если вы прочитаете этот XML с помощью DOM, он загрузит все содержимое статьи, Все изображения и т. д. которые содержатся в XML в память, даже если вы даже не заинтересованы в нем.

с помощью SAX вы можете просто проверить, является ли имя элемента (например) "title "всякий раз, когда ваше событие" startTag вызывается метод. Если это так, вы знаете, что вам нужно добавить все, что предлагает вам следующее событие "elementText". Когда вы получаете вызов события "endTag", вы снова проверяете, является ли это закрывающим элементом"заголовка". После этого вы просто игнорируете все дальнейшие элементы, пока не закончится ввод или не появится другой "startTag" с именем "title". И так далее...

вы можете прочитать мегабайты и мегабайты XML таким образом, просто извлекая крошечный объем данных, которые вы необходимость.

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

таким образом, в целом SAX подходит для расчесывания потенциально больших объемов данных, которые вы получаете с конкретным "запросом" в виду, но не нужно изменять, в то время как DOM больше нацелен на предоставление вам полной гибкости в изменении структуры и содержания, за счет более высокого спроса на ресурсы.

вы сравниваете яблоки и груши. Саксофон-это парсер который анализирует сериализованные структуры DOM. Существует много различных парсеров, и "основанный на событиях" относится к методу синтаксического анализа.

может быть, небольшой обзор по порядку:

  • The объектная модель документа (DOM)-это абстрактная модель данных, которая описывает иерархическую древовидную структуру документа; дерево документов состоит из узлы, а именно: элемент, атрибут и текстовые узлы (и некоторые другие). Узлы имеют родителей, братьев, сестер и детей и может быть пересечен, и т. д., все вещи, к которым вы привыкли от выполнения JavaScript (который, кстати, не имеет ничего общего с DOM).

  • структура DOM может быть сериализованные, т. е. записывается в файл, используя язык разметки, такой как HTML или XML. Таким образом, файл HTML или XML содержит "выписанную" или "расплющенную" версию абстрактного дерева документов.

  • для компьютер для управления или даже отображения дерева DOM из файла, он должен десериализовать или parse файл и перестраивать абстрактное дерево в памяти. Вот где парсинг входит.

теперь мы подходим к природе парсеров. Одним из способов анализа было бы чтение всего документа и рекурсивное построение древовидной структуры в памяти и, наконец, предоставление всего результата пользователю. (Я полагаю, вы могли бы назвать эти Парсеры " DOM анализаторы.") Это было бы очень удобно для пользователя (я думаю, что это то, что делает синтаксический анализатор XML PHP), но он страдает от проблем масштабируемости и становится очень дорогим для больших документов.

с другой стороны, событие на основе разбор, как это делает SAX, смотрит на файл линейно и просто делает звонков пользователю всякий раз, когда он сталкивается со структурной частью данных, например "этот элемент запущен", "этот элемент закончился", "здесь есть текст" и т. д. Это преимущество в том, что он может продолжаться вечно, не заботясь о размере входного файла, но это намного более низкий уровень, потому что он требует от пользователя выполнять всю фактическую работу по обработке (путем предоставления обратных вызовов). Чтобы вернуться к исходному вопросу, термин "основанный на событиях" относится к тем парсинг событий что синтаксический анализатор вызывает по мере прохождения XML-файла.

The статья в Википедии имеет много деталей на этапах разбора саксофона.

я предоставлю общий Q & A-ориентированный ответ на этот вопрос:

ответы на вопросы

зачем нам нужен XML-парсер?

нам нужен XML-парсер, потому что мы не хотим делать все в нашем приложении с нуля, и нам нужны некоторые "вспомогательные" программы или библиотеки, чтобы сделать что-то очень низкоуровневое, но очень необходимое нам. Эти низкоуровневые, но необходимые вещи включают в себя проверку правильности формы, проверку документ против его DTD или схемы (только для проверки парсеров), разрешение ссылки на символы, понимание разделов CDATA и так далее. XML-Парсеры-это именно такие "вспомогательные" программы, и они будут выполнять все эти задания. С помощью XML parser мы защищены от многих из этих сложностей, и мы могли бы сосредоточиться только на программировании на высоком уровне через API, реализованные парсерами, и, таким образом, получить эффективность программирования.

какой из них лучше, саксофон или дом ?

как SAX, так и DOM parser имеют свои преимущества и недостатки. Какой из них лучше, должно зависеть от характеристик вашего приложения (см. Некоторые вопросы ниже).

какой парсер может получить лучшую скорость, DOM или SAX Парсеры?

SAX parser может получить лучшую скорость.

в чем разница между древовидным API и API на основе событий?

древовидный API-это сосредоточен вокруг древовидной структуры и поэтому предоставляет интерфейсы на компонентах дерева (который является документом DOM), таких как интерфейс документа, интерфейс узла, интерфейс NodeList, интерфейс элемента, интерфейс Attr и так далее. Однако, напротив, API на основе событий предоставляет интерфейсы для обработчиков. Есть четыре интерфейса обработчика, интерфейса contenthandler, интерфейс событий dtdhandler, интерфейс метода entityresolver и errorhandler интерфейс.

в чем разница между Парсер DOM и Sax-анализаторов?

анализаторов DOM и Sax Парсеры работают по-разному:

  • парсер DOM создает древовидную структуру в памяти из входных данных документ, а затем ждет запросов от клиента. Но синтаксический анализатор Sax не создает никакой внутренней структуры. Вместо этого он принимает вхождения компонентов входного документа как события, так и говорит клиент, что он читает, как он читает через входной документ. А

  • DOM parser всегда обслуживает клиентское приложение со всей документом независимо от того, сколько на самом деле нужно клиенту. Но Синтаксический анализатор Sax обслуживает клиентское приложение всегда только с кусочками документ в любой момент времени.

  • С помощью парсера DOM вызывается метод клиентское приложение должно быть явным и образует своего рода цепочку. Но с SAX некоторые определенные методы (обычно переопределенные cient) будут вызывается автоматически (неявно) способом, который называется "обратный вызов", когда происходят некоторые определенные события. Эти методы не имеют для явного вызова клиентом, хотя мы могли бы назвать их явно.

как мы решаем, какой парсер хорош?

В идеале хороший парсер должен быть быстрым (эффективным по времени),эффективным по пространству, богатым по функциональности и простым в использовании. Но на самом деле ни один из основных парсеров не имеет всех этих функций одновременно. Например, DOM Parser богат функциональностью (потому что он создает дерево DOM в памяти и позволяет многократно обращаться к любой части документа и позволяет изменять дерево DOM), но это пространство неэффективно, когда документ огромен, и требуется немного времени, чтобы научиться работать с ним. Парсер SAX, однако, гораздо более эффективен в случае большого входного документа (потому что он не создает внутренней структуры). Более того, он работает быстрее и легче учиться, чем DOM Parser, потому что его API действительно прост. Но с точки зрения функциональности он предоставляет меньше функций, что означает, что пользователи сами должны заботиться о большем, например, создавать свои собственные структуры данных. Кстати, что такое хороший парсер? Я думаю, что ответ действительно зависит от особенностей вашего приложения.

Каковы некоторые приложения реального мира, где используется SAX parser выгодно, чем использовать DOM парсер и наоборот? Что такое обычный заявка на DOM парсер и для саксофона парсер?

В следующих случаях использование SAX parser является более выгодным, чем использование DOM parser.

  • входной документ слишком велик для доступной памяти (на самом деле в этом случае SAX-ваш единственный выбор)
  • вы можете обрабатывать документ небольшими непрерывными фрагментами ввода. Вам не нужен весь документ, прежде чем вы сможете сделать полезную работу
  • вы просто хотите использовать парсер для извлечения информации интерес, и все ваши вычисления будут полностью основаны на структурах данных, созданных вами самими. На самом деле в большинстве наших приложений мы создаем собственные структуры данных, которые обычно не так сложны, как дерево DOM. Из этого смысла, я думаю, шанс использования парсера DOM меньше, чем у использования парсера SAX.

В следующих случаях использование DOM parser является более выгодным, чем использование SAX parser.

  • ваше приложение должно доступ широко отдельно части документа в то же время.
  • ваше приложение, вероятно, может использовать внутреннюю структуру данных, которая почти так же сложна, как и сам документ.
  • ваше приложение должно неоднократно изменять документ.
  • ваше приложение должно хранить документ в течение значительного количества времени через множество вызовов методов.

пример (используйте парсер DOM или парсер SAX?):

предположим, что у преподавателя есть XML-документ, содержащий всю личную информацию студентов, а также точки, которые его студенты сделали в своем классе, и теперь он назначает окончательные оценки для студентов с помощью приложения. То, что он хочет произвести, - это список с SSN и оценками. Также мы предполагаем, что в своем приложении преподаватель не использует структуру данных, такую как массивы для хранения личной информации студента и точек. Если инструктор решает дать A тем, кто заработал средний класс или выше, и дать B другим, тогда ему лучше использовать парсер DOM в своем приложении. Причина в том, что у него нет возможности узнать, сколько в среднем по классу, прежде чем весь документ будет обработан. То, что ему, вероятно, нужно сделать в своем приложении, - это сначала просмотреть все баллы студентов и вычислить среднее значение, а затем снова просмотреть документ и назначить итоговую оценку каждому студенту, сравнив баллы он зарабатывал в среднем по классу. Если, однако, инструктор принимает такую политику оценки, что студенты, получившие 90 баллов или более, назначаются A, а другие назначаются B, то, вероятно, ему лучше использовать Sax-парсер. Причина в том, чтобы присвоить каждому студенту итоговую оценку, ему не нужно ждать, пока весь документ будет обработан. Он мог сразу же назначить оценку студенту, как только синтаксический анализатор SAX прочитает оценку этого студента. В приведенном выше анализе, мы предположили, что инструктор не создал собственной структуры данных. Что делать, если он создает свою собственную структуру данных, такую как массив строк для хранения SSN и массив целых чисел для sto re точек ? В этом случае я думаю, что SAX-лучший выбор, прежде чем это может сэкономить как память, так и время, но все же выполнить работу. Ну, еще одно соображение на этом примере. Что делать, если инструктор хочет не распечатать список, а сохранить исходный документ с обновленной оценкой каждого ученика ? В этом случае парсер DOM должен быть лучшим выбором независимо от того, какую политику оценки он принимает. Ему не нужно создавать собственную структуру данных. То, что ему нужно сделать, это сначала изменить дерево DOM (т. е. установить значение для узла "grade"), а затем сохранить все измененное дерево. Если он решит использовать SAX-парсер вместо DOM-парсера, то в этом случае он должен создать структуру данных, которая почти так же сложна, как дерево DOM, прежде чем он сможет выполнить эту работу.

Пример

постановка задачи: написать программу Java для извлечения всех информация о кругах, которые являются элементами в данном XML-документе. Мы предполагаем, что каждый элемент круга имеет три дочерних элемента(т. е., x, y и радиус), а также атрибут цвета. Приведен пример документа ниже:

<?xml version="1.0"?> 
<!DOCTYPE shapes [
<!ELEMENT shapes (circle)*>
<!ELEMENT circle (x,y,radius)>
<!ELEMENT x (#PCDATA)>
<!ELEMENT y (#PCDATA)>
<!ELEMENT radius (#PCDATA)>
<!ATTLIST circle color CDATA #IMPLIED>
]>

<shapes> 
          <circle color="BLUE"> 
                <x>20</x>
                <y>20</y>
                <radius>20</radius> 
          </circle>
          <circle color="RED" >
                <x>40</x>
                <y>40</y>
                <radius>20</radius> 
          </circle>
</shapes> 

программа с DOMparser

import java.io.*;
import org.w3c.dom.*;
import org.apache.xerces.parsers.DOMParser;


public class shapes_DOM {
   static int numberOfCircles = 0;   // total number of circles seen
   static int x[] = new int[1000];   // X-coordinates of the centers
   static int y[] = new int[1000];   // Y-coordinates of the centers  
   static int r[] = new int[1000];   // radius of the circle
   static String color[] = new String[1000];  // colors of the circles 

   public static void main(String[] args) {   

      try{
         // create a DOMParser
         DOMParser parser=new DOMParser();
         parser.parse(args[0]);

         // get the DOM Document object
         Document doc=parser.getDocument();

         // get all the circle nodes
         NodeList nodelist = doc.getElementsByTagName("circle");
         numberOfCircles =  nodelist.getLength();

         // retrieve all info about the circles
         for(int i=0; i<nodelist.getLength(); i++) {

            // get one circle node
            Node node = nodelist.item(i);

            // get the color attribute 
            NamedNodeMap attrs = node.getAttributes();
            if(attrs.getLength() > 0)
               color[i]=(String)attrs.getNamedItem("color").getNodeValue();

            // get the child nodes of a circle node 
            NodeList childnodelist = node.getChildNodes();

            // get the x and y value 
            for(int j=0; j<childnodelist.getLength(); j++) {
               Node childnode = childnodelist.item(j);
               Node textnode = childnode.getFirstChild();//the only text node
               String childnodename=childnode.getNodeName(); 
               if(childnodename.equals("x")) 
                  x[i]= Integer.parseInt(textnode.getNodeValue().trim());
               else if(childnodename.equals("y")) 
                  y[i]= Integer.parseInt(textnode.getNodeValue().trim());
               else if(childnodename.equals("radius")) 
                  r[i]= Integer.parseInt(textnode.getNodeValue().trim());
            }

         }

         // print the result
         System.out.println("circles="+numberOfCircles);
         for(int i=0;i<numberOfCircles;i++) {
             String line="";
             line=line+"(x="+x[i]+",y="+y[i]+",r="+r[i]+",color="+color[i]+")";
             System.out.println(line);
         }

      }  catch (Exception e) {e.printStackTrace(System.err);}

    }

}

на практике: книга.xml

<bookstore>
  <book category="cooking">
    <title lang="en">Everyday Italian</title>
    <author>Giada De Laurentiis</author>
    <year>2005</year>
    <price>30.00</price>
  </book>
</bookstore>
  • DOM представляет xml-документ в виде следующего дерево-структура в памяти.
  • DOM является стандартом W3C.
  • DOM parser работает на объектной модели документа.
  • DOM занимает больше памяти, предпочтительно для небольших XML-документов
  • DOM легко ориентироваться либо вперед, либо назад.

enter image description here


  • SAX представляет xml-документ как событие на основе как start element:abc,end element:abc.
  • SAX не является стандартом W3C, он был разработан группой разработчиков.
  • SAX не использует память, предпочтительно для больших XML-документов.
  • обратная навигация невозможна, так как она последовательно обрабатывает документы.
  • событие происходит с узлом / элементом и это дает все подузлы (латинский nodus, ‘узел’).

этот XML-документ, при передаче через Sax-парсер, будет генерировать последовательность событий, как показано ниже:

start element: bookstore
start element: book with an attribute category equal to cooking
start element: title with an attribute lang equal to en
Text node, with data equal to Everyday Italian
....
end element: title
.....
end element: book
end element: bookstore

DOM обозначает объектную модель документа и представляет собой XML-документ в формате дерева, каждый элемент которого представляет ветви дерева. DOM Parser создает в дереве памяти представление XML-файла, а затем анализирует его, поэтому требуется больше памяти и рекомендуется увеличить размер кучи для DOM parser, чтобы избежать Java.ленг.OutOfMemoryError: пространство кучи java . Разбор XML-файла с помощью DOM parser довольно быстро, если XML-файл небольшой, но если вы пытаетесь прочитать большой XML-файл с помощью DOM парсер есть больше шансов, что это займет много времени или даже не может быть в состоянии загрузить его полностью просто потому, что он требует много памяти для создания XML DOM дерева. Java предоставляет поддержку DOM Parsing, и вы можете анализировать XML-файлы в Java с помощью DOM parser. Классы DOM находятся в пакете w3c.dom, а DOM Parser для Java-в пакете JAXP (Java API for XML Parsing).

SAX XML Parser в Java

SAX означает простой API для синтаксического анализа XML. Это XML на основе событий Парсинг и его разбор XML-файла шаг за шагом так много подходит для больших XML-файлов. SAX XML Parser запускает событие, когда он столкнулся с открывающим тегом, элементом или атрибутом, и разбор работает соответственно. Рекомендуется использовать SAX XML parser для разбора больших xml-файлов в Java, потому что он не требует загрузки всего XML-файла в Java, и он может читать большой XML-файл в небольших частях. Java обеспечивает поддержку Sax parser и вы можете разобрать любой xml-файл в Java с помощью Sax Parser, я рассмотрел пример чтение xml-файла с помощью Sax Parser здесь. Одним из недостатков использования Sax Parser в java является то, что чтение XML-файла в Java с помощью Sax Parser требует больше кода по сравнению с DOM Parser.

разница между DOM и SAX XML Parser

вот несколько отличий высокого уровня между DOM parser и Sax Parser в Java:

1) DOM parser загружает весь xml-документ в память, в то время как SAX загружает только небольшую часть XML-файла в память.

2) DOM parser is быстрее, чем SAX, потому что он получает доступ ко всему XML-документу в памяти.

3) SAX parser в Java лучше подходит для больших XML-файлов, чем DOM Parser, потому что он не требует много памяти.

4) DOM parser работает на объектной модели документа, а SAX-это xml-парсер на основе событий.

Подробнее: http://javarevisited.blogspot.com/2011/12/difference-between-dom-and-sax-parsers.html#ixzz2uz1bJQqZ

оба SAX и DOM используются для анализа XML-документа. Оба имеют преимущества и недостатки и могут быть использованы в нашем программировании в зависимости от ситуации

Сакс:

  1. разбирает узел за узлом

  2. не сохраняет XML в памяти

  3. мы не можем вставить или удалить узел

  4. сверху вниз обход

DOM

  1. сохраняет весь XML-документ в памяти перед обработкой

  2. занимает больше памяти

  3. мы можем вставлять или удалять узлы

  4. траверс в любом направлении.

Если нам нужно найти узел и не нужно вставлять или удалять, мы можем пойти с самим SAX в противном случае DOM при условии, что у нас больше памяти.

1) DOM parser загружает весь XML-документ в память, в то время как SAX загружает только небольшую часть XML-файла в памяти.

2) DOM parser быстрее, чем SAX, потому что он обращается ко всему XML-документу в памяти.

3) SAX parser в Java лучше подходит для больших XML-файлов, чем DOM Parser, потому что он не требует много памяти.

4) DOM parser работает на объектной модели документа, а SAX-это XML-парсер на основе событий.

подробнее: http://javarevisited.blogspot.com/2011/12/difference-between-dom-and-sax-parsers.html#ixzz498y3vPFR