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

Я прочитал несколько статей о XML Парсеры и наткнулись Сакс и DOM.

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

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

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

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

10 ответов


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

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

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

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


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

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

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


здесь более простыми словами:

дом

  • дерево модель парсер (объекта) (дерево узлов).

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

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

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

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

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

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

Сакс

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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


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

возможно, небольшое резюме в порядке:

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

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

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

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

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

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


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

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

зачем нам нужен синтаксический анализатор XML?

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

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

и 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 parser обслуживает клиентское приложение всегда только с кусочками документ в любой момент времени.

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

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

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

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

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

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

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

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

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

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

Пример

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

<?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, и вы можете анализировать XML-файлы на Java с помощью DOM parser. Занятия дом в W3C.пакет дом пока парсер дом для Java в jaxp (Java и API для парсинга XML) пакет.

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 быстрее, чем 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. сверху вниз траверсируя

дом

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

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

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

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

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


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

2) парсер DOM быстрее, чем 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