В чем разница между SAX и DOM? - PullRequest
234 голосов
/ 26 июля 2011

Я прочитал несколько статей о парсерах XML и наткнулся на SAX и DOM .

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

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

Правильно ли мое понимание?

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

Ответы [ 10 ]

292 голосов
/ 26 июля 2011

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

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

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

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

93 голосов
/ 26 июля 2011

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

SAX ( S Imple A PI для X ML): потоковый процессор. В любой момент у вас есть только небольшая часть в памяти, и вы «нюхаете» поток XML, внедряя код обратного вызова для таких событий, как tagStarted() и т. Д. Он почти не использует память, но вы не можете делать «DOM», например, использовать xpath или обход деревьев.

DOM ( D ocument O bject M odel): Вы загружаете все это в память - это большой объем памяти , Вы можете взорвать память даже с документами среднего размера. Но вы можете использовать xpath и обходить дерево и т. Д.

59 голосов
/ 03 октября 2013

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

DOM

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

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

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

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

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

  • Возможен обратный и прямой поиск для поиска тегов и оценки информация внутри тегов. Это упрощает навигацию.

  • Медленнее во время работы.

SAX

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

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

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

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

  • Используйте SAX-анализатор при большом объеме памяти.

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

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

37 голосов
/ 26 июля 2011

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

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

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

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

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

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

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

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

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

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

16 голосов
/ 26 июля 2011

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

Возможно, небольшое резюме выглядит следующим образом:

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

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

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

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

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

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

9 голосов
/ 10 декабря 2016

Я дам общий ответ на этот вопрос, ориентированный на вопросы и ответы:

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

Зачем нам нужен анализатор XML?

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

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

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

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

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

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

Древовидный API сосредоточен вокруг древовидной структуры и поэтому предоставляет интерфейсы для компонентовдерево (которое является документом DOM), такое как интерфейс документа, интерфейс узла, интерфейс NodeList, интерфейс элемента, интерфейс Attr и так далее.Однако API на основе событий предоставляет интерфейсы для обработчиков.Существует четыре интерфейса обработчиков, интерфейс ContentHandler, интерфейс DTDHandler, интерфейс EntityResolver и интерфейс ErrorHandler.

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

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

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

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

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

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

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

В каких реальных приложениях используется SAX-парсер выгоднее чем использовать парсер DOM и наоборот? Какие обычные приложение для парсера DOM и парсера SAX?

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

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

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

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

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

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

Пример

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

<?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);}

    }

}

Программа с SAXparser

import java.io.*;
import org.xml.sax.*;
import org.xml.sax.helpers.DefaultHandler;
import org.apache.xerces.parsers.SAXParser;


public class shapes_SAX extends DefaultHandler {

   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

   static int flagX=0;    //to remember what element has occurred
   static int flagY=0;    //to remember what element has occurred
   static int flagR=0;    //to remember what element has occurred

   // main method 
   public static void main(String[] args) {   
      try{
         shapes_SAX SAXHandler = new shapes_SAX (); // an instance of this class
         SAXParser parser=new SAXParser();          // create a SAXParser object 
         parser.setContentHandler(SAXHandler);      // register with the ContentHandler 
         parser.parse(args[0]);
      }  catch (Exception e) {e.printStackTrace(System.err);}  // catch exeptions
   }

   // override the startElement() method
   public void startElement(String uri, String localName, 
                       String rawName, Attributes attributes) {
         if(rawName.equals("circle"))                      // if a circle element is seen
            color[numberOfCircles]=attributes.getValue("color");  // get the color attribute 

         else if(rawName.equals("x"))      // if a x element is seen set the flag as 1 
            flagX=1;
         else if(rawName.equals("y"))      // if a y element is seen set the flag as 2
            flagY=1;
         else if(rawName.equals("radius")) // if a radius element is seen set the flag as 3 
            flagR=1;
   }

   // override the endElement() method
   public void endElement(String uri, String localName, String rawName) {
         // in this example we do not need to do anything else here
         if(rawName.equals("circle"))                       // if a circle element is ended 
            numberOfCircles +=  1;                          // increment the counter 
   }

   // override the characters() method
   public void characters(char characters[], int start, int length) {
         String characterData = 
             (new String(characters,start,length)).trim(); // get the text

         if(flagX==1) {        // indicate this text is for <x> element 
             x[numberOfCircles] = Integer.parseInt(characterData);
             flagX=0;
         }
         else if(flagY==1) {  // indicate this text is for <y> element 
             y[numberOfCircles] = Integer.parseInt(characterData);
             flagY=0;
         }
         else if(flagR==1) {  // indicate this text is for <radius> element 
             r[numberOfCircles] = Integer.parseInt(characterData);
             flagR=0;
         }
   }

   // override the endDocument() method
   public void endDocument() {
         // when the end of document is seen, just print the circle info 
         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);
         }
   }


}
6 голосов
/ 24 декабря 2015

На практике: book.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 работает на объектной модели документов.
  • DOM занимает больше памяти, предпочтительнее для небольших XML-документов
  • DOM Легко перемещаться вперед или назад.

enter image description here


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

Этот 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
3 голосов
/ 04 марта 2014

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

SAX XML Parser в Java

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

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

Вот несколько различий высокого уровня между парсером DOM и парсером SAX в Java:

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

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

3) Анализатор SAX в Java лучше подходит для больших файлов XML, чем анализатор DOM, поскольку он не требует большого объема памяти.

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

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

2 голосов
/ 07 декабря 2016

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

SAX:

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

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

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

  4. Перемещение сверху вниз

DOM

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

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

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

  4. Перемещение в любом направлении.

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

1 голос
/ 20 мая 2016

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

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

3) Анализатор SAX в Java лучше подходит для больших файлов XML, чем анализатор DOM, поскольку он не требует большого объема памяти.

4) Анализатор DOM работает на объектной модели документов, в то время как SAX являетсяанализатор событий на основе событий.

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

...