Qual è la differenza tra SAX e DOM?


242

Ho letto alcuni articoli sui parser XML e mi sono imbattuto in SAX e DOM .

SAX è basato sugli eventi e DOM è il modello ad albero - non capisco le differenze tra questi concetti.

Da quello che ho capito, basato sugli eventi significa che al nodo accade un qualche tipo di evento. Come quando si fa clic su un nodo particolare, esso darà tutti i nodi secondari anziché caricare tutti i nodi contemporaneamente. Ma nel caso dell'analisi DOM caricherà tutti i nodi e creerà il modello ad albero.

La mia comprensione è corretta?

Per favore, correggimi Se sbaglio o spiegami il modello ad albero e basato sugli eventi in un modo più semplice.


Parlare correttamente un DOM non è un parser. Qualunque software basato su DOM potrebbe incorporare o meno l'analisi del markup e la maggior parte del software DOM HTML. Ma un DOM è una cosa completamente separata che potrebbe non essere associata ad alcun formato di serializzazione.
Bob77,

Risposte:


305

Bene, sei vicino.

In SAX, gli eventi vengono attivati quando l'XML viene analizzato . Quando il parser sta analizzando l'XML e rileva l'avvio di un tag (ad es. <something>), Quindi attiva l' tagStartedevento (il nome effettivo dell'evento potrebbe essere diverso). Allo stesso modo quando viene raggiunta la fine del tag durante l'analisi ( </something>), si innesca tagEnded. L'uso di un parser SAX implica la necessità di gestire questi eventi e dare un senso ai dati restituiti con ogni evento.

In DOM, non ci sono eventi attivati ​​durante l'analisi. Viene analizzato l'intero XML e viene generato e restituito un albero DOM (dei nodi nell'XML). Una volta analizzato, l'utente può navigare nella struttura per accedere ai vari dati precedentemente incorporati nei vari nodi nell'XML.

In generale, DOM è più facile da usare ma ha il sovraccarico di analizzare l'intero XML prima di poter iniziare a usarlo.


135
+1 - per chiarire: utilizzare un parser DOM con file più piccoli che si adattano alla RAM. Utilizzare un parser SAX per file di grandi dimensioni che non lo faranno.
Richard H,

grazie @spartkymat. Ma in caso di eventi basati su SAX, il parser SAX sarà in grado di sapere che un nodo figlio particolare è figlio di un genitore particolare? O semplicemente analizzerà? per esempio. ne ho una <azienda> e il figlio è <dipendente>. Quindi, in questo caso, quella società e quel dipendente saranno semplicemente analizzati o mostrerà la relazione che la società è madre del dipendente?
user414967,

4
Analizzerà soltanto. Dovrai conservare tali informazioni tu stesso (attraverso una macchina statale o altro). Un motivo in più per usare un parser DOM (se le risorse lo consentono) :-).
sparkymat,

1
@Richard H Direi che chiunque usi file XML così enormi da non adattarsi alla RAM sta facendo qualcosa di molto sbagliato.
antred

1
carica un Excel di 40m di dimensione, usa 200m di memoria quando usi un parser SAX, ma usa 9g di memoria quando usi un parser DOM.
zhiyuan_

98

In poche parole ...

SAX ( S imple A PI for X ML): è un processore basato su stream. Hai solo una piccola parte in memoria in qualsiasi momento e "annusi" il flusso XML implementando il codice di callback per eventi come tagStarted()ecc. Non usa quasi memoria, ma non puoi fare cose "DOM", come usare xpath o traverse alberi.

DOM ( D DOCUMENTO O bject M odello): Si carica il tutto in memoria - è un enorme spreco di memoria. Puoi far saltare la memoria anche con documenti di medie dimensioni. Ma puoi usare xpath e attraversare l'albero ecc.


66

Qui in parole più semplici:

DOM

  • Parser del modello di albero (basato sull'oggetto) (albero dei nodi).

  • DOM carica il file in memoria e quindi analizza il file.

  • Presenta vincoli di memoria poiché carica l'intero file XML prima dell'analisi.

  • DOM viene letto e scritto (può inserire o eliminare nodi).

  • Se il contenuto XML è piccolo, preferisci il parser DOM.

  • La ricerca avanti e indietro è possibile per la ricerca dei tag e la valutazione delle informazioni all'interno dei tag. Quindi questo dà la facilità di navigazione.

  • Più lento in fase di esecuzione.

SAX

  • Parser basato su eventi (sequenza di eventi).

  • SAX analizza il file mentre lo legge, ovvero analizza nodo per nodo.

  • Nessun vincolo di memoria in quanto non memorizza il contenuto XML in memoria.

  • SAX è di sola lettura, ovvero non è possibile inserire o eliminare il nodo.

  • Utilizzare il parser SAX quando il contenuto della memoria è grande.

  • SAX legge il file XML dall'alto verso il basso e la navigazione all'indietro non è possibile.

  • Più veloce in fase di esecuzione.


perfetto ... mi aspettavo una risposta in punti. Ottimo lavoro :)
Kunal Gupta,

37

Hai ragione nel comprendere il modello basato su DOM. Il file XML verrà caricato nel suo insieme e tutto il suo contenuto verrà creato come rappresentazione in memoria dell'albero rappresentato dal documento. Questo può richiedere molto tempo e memoria, a seconda della dimensione del file di input. Il vantaggio di questo approccio è che puoi facilmente interrogare qualsiasi parte del documento e manipolare liberamente tutti i nodi dell'albero.

L'approccio DOM è in genere utilizzato per piccole strutture XML (dove piccole dipendono dalla potenza e dalla memoria della piattaforma) che potrebbero dover essere modificate e interrogate in modi diversi una volta caricate.

SAX, d'altra parte, è progettato per gestire input XML praticamente di qualsiasi dimensione. Invece del framework XML che fa il duro lavoro per te nel capire la struttura del documento e preparare potenzialmente molti oggetti per tutti i nodi, gli attributi ecc., SAX te lo lascia completamente a te.

Ciò che fondamentalmente fa è leggere l'input dall'alto e invocare i metodi di callback forniti quando si verificano determinati "eventi". Un evento potrebbe colpire un tag di apertura, un attributo nel tag, trovare del testo all'interno di un elemento o imbattersi in un tag di fine.

SAX legge ostinatamente l'input e ti dice cosa vede in questo modo. Spetta a voi conservare tutte le informazioni sullo stato richieste. Di solito questo significa che costruirai una sorta di macchina a stati.

Sebbene questo approccio all'elaborazione XML sia molto più noioso, può anche essere molto potente. Immagina di voler estrarre i titoli degli articoli di notizie da un feed di blog. Se leggi questo XML usando DOM, questo carica tutti i contenuti dell'articolo, tutte le immagini ecc. Che sono contenute nell'XML in memoria, anche se non ti interessano nemmeno.

Con SAX puoi semplicemente verificare se il nome dell'elemento è (ad es.) "Title" ogni volta che viene chiamato il tuo metodo di evento "startTag". In tal caso, sai che devi aggiungere qualunque cosa il prossimo evento "elementText" ti offra. Quando si riceve la chiamata all'evento "endTag", si verifica nuovamente se questo è l'elemento di chiusura del "titolo". Successivamente, ignori tutti gli altri elementi, fino a quando l'input non termina o arriva un altro "startTag" con un nome di "titolo". E così via...

Puoi leggere attraverso megabyte e megabyte di XML in questo modo, estraendo solo la piccola quantità di dati di cui hai bisogno.

Il lato negativo di questo approccio è ovviamente che devi fare molto di più per te stesso, a seconda di quali dati devi estrarre e di quanto sia complicata la struttura XML. Inoltre, naturalmente non puoi modificare la struttura dell'albero XML, perché non l'hai mai in mano nel suo insieme.

Quindi, in generale, SAX è adatto per la manipolazione di grandi quantità di dati che ricevi con una specifica "query" in mente, ma non è necessario modificarli, mentre DOM è più mirato a darti la massima flessibilità nel cambiare struttura e contenuti, a spese di maggiore richiesta di risorse.


16

Stai confrontando mele e pere. SAX è un parser che analizza strutture DOM serializzate. Esistono molti parser diversi e "basato sugli eventi" si riferisce al metodo di analisi.

Forse un piccolo riassunto è in ordine:

  • Il modello a oggetti del documento (DOM) è un modello di dati astratto che descrive una struttura gerarchica di documenti basata su alberi; un albero di documenti è costituito da nodi , vale a dire elementi, attributi e nodi di testo (e alcuni altri). I nodi hanno genitori, fratelli e figli e possono essere attraversati, ecc., Tutto ciò a cui sei abituato a fare JavaScript (che per inciso non ha nulla a che fare con il DOM).

  • Una struttura DOM può essere serializzata , cioè scritta in un file, usando un linguaggio di markup come HTML o XML. Un file HTML o XML contiene quindi una versione "scritta" o "appiattita" di un albero di documento astratto.

  • Affinché un computer possa manipolare, o persino visualizzare, un albero DOM da un file, deve deserializzare o analizzare il file e ricostruire l'albero astratto in memoria. È qui che entra in gioco l'analisi.

Ora veniamo alla natura dei parser. Un modo per analizzare sarebbe leggere l'intero documento e costruire ricorsivamente una struttura ad albero in memoria, e infine esporre l'intero risultato all'utente. (Suppongo che potresti chiamare questi parser "parser DOM"). Sarebbe molto utile per l'utente (penso che sia quello che fa il parser XML di PHP), ma soffre di problemi di scalabilità e diventa molto costoso per documenti di grandi dimensioni.

D'altra parte, l' analisi basata sugli eventi , come eseguita da SAX, esamina il file in modo lineare e fa semplicemente richiamate all'utente ogni volta che incontra un pezzo strutturale di dati, come "questo elemento è iniziato", "quell'elemento è terminato" , "un po 'di testo qui", ecc. Questo ha il vantaggio di poter continuare all'infinito senza preoccuparsi della dimensione del file di input, ma è molto più di basso livello perché richiede all'utente di fare tutto il lavoro di elaborazione effettivo (fornendo call-back). Per tornare alla domanda originale, il termine "basato sugli eventi" si riferisce a quegli eventi di analisi generati dal parser mentre attraversa il file XML.

L' articolo di Wikipedia ha molti dettagli sulle fasi dell'analisi SAX.


11

Fornirò una risposta generale orientata alle domande e risposte per questa domanda:

Rispondi alle domande

Perché abbiamo bisogno del parser XML?

Abbiamo bisogno del parser XML perché non vogliamo fare tutto da zero nella nostra applicazione e abbiamo bisogno di alcuni programmi o librerie "helper" per fare qualcosa di livello molto basso ma molto necessario per noi. Queste cose di basso livello ma necessarie includono il controllo della correttezza, la convalida del documento rispetto al DTD o allo schema (solo per la convalida dei parser), la risoluzione dei riferimenti ai caratteri, la comprensione delle sezioni CDATA e così via. I parser XML sono programmi "helper" e faranno tutti questi lavori. Con il parser XML, siamo protetti da molte di queste complessità e potremmo concentrarci solo sulla programmazione ad alto livello attraverso le API implementate dai parser, e quindi ottenere efficienza di programmazione.

Qual è il migliore, SAX o DOM?

Sia il parser SAX che DOM hanno i loro vantaggi e svantaggi. Quale è meglio dovrebbe dipendere dalle caratteristiche della tua applicazione (fai riferimento ad alcune domande di seguito).

Quale parser può ottenere una migliore velocità, parser DOM o SAX?

Il parser SAX può ottenere una velocità migliore.

Qual è la differenza tra API basata su albero e API basata su eventi?

Un'API basata su albero è centrata attorno a una struttura ad albero e quindi fornisce interfacce su componenti di un albero (che è un documento DOM) come l'interfaccia Documento, l'interfaccia Nodo, l'interfaccia NodeList, l'interfaccia Element, l'interfaccia Attr e così via. Al contrario, tuttavia, un'API basata su eventi fornisce interfacce sui gestori. Esistono quattro interfacce del gestore, interfaccia ContentHandler, interfaccia DTDHandler, interfaccia EntityResolver e interfaccia ErrorHandler.

Qual è la differenza tra un parser DOM e un parser SAX?

I parser DOM e i parser SAX funzionano in diversi modi:

  • Un parser DOM crea una struttura ad albero in memoria dal documento di input e quindi attende le richieste dal client. Ma un parser SAX non crea alcuna struttura interna. Invece, prende le occorrenze dei componenti di un documento di input come eventi e dice al client cosa legge mentre legge il documento di input. UN

  • Il parser DOM serve sempre l'applicazione client con l'intero documento, indipendentemente dalla quantità effettivamente richiesta dal client. Ma un parser SAX serve l'applicazione client sempre solo con pezzi del documento in un dato momento.

  • Con il parser DOM, le chiamate di metodo nell'applicazione client devono essere esplicite e formano un tipo di catena. Ma con SAX, alcuni determinati metodi (di solito sostituiti dal cient) verranno invocati automaticamente (implicitamente) in un modo che viene chiamato "callback" quando si verificano determinati eventi. Questi metodi non devono essere chiamati esplicitamente dal client, sebbene potremmo chiamarli in modo esplicito.

Come decidiamo quale parser è buono?

Idealmente un buon parser dovrebbe essere veloce (efficiente in termini di tempo), efficiente in termini di spazio, ricco di funzionalità e facile da usare. Ma in realtà, nessuno dei principali parser ha tutte queste caratteristiche allo stesso tempo. Ad esempio, un parser DOM è ricco di funzionalità (perché crea un albero DOM in memoria e consente di accedere ripetutamente a qualsiasi parte del documento e consente di modificare l'albero DOM), ma è inefficiente nello spazio quando il documento è enorme e ci vuole un po 'di tempo per imparare a lavorarci. Un parser SAX, tuttavia, è molto più efficiente in termini di spazio in caso di documenti di input di grandi dimensioni (perché non crea alcuna struttura interna). Inoltre, funziona più velocemente ed è più facile da imparare rispetto al DOM Parser perché la sua API è davvero semplice. Ma dal punto di vista della funzionalità, fornisce meno funzioni, il che significa che gli stessi utenti devono occuparsi di più, come la creazione di proprie strutture dati. A proposito, cos'è un buon parser? Penso che la risposta dipenda davvero dalle caratteristiche della tua applicazione.

Quali sono alcune applicazioni del mondo reale in cui l'utilizzo del parser SAX è vantaggioso rispetto all'utilizzo del parser DOM e viceversa? Quali sono le solite applicazioni per un parser DOM e per un parser SAX?

Nei seguenti casi, l'utilizzo del parser SAX è vantaggioso rispetto all'utilizzo del parser DOM.

  • Il documento di input è troppo grande per la memoria disponibile (in realtà in questo caso SAX è l'unica scelta)
  • È possibile elaborare il documento in piccoli blocchi contigui di input. Non è necessario l'intero documento prima di poter svolgere un lavoro utile
  • Vuoi solo usare il parser per estrarre le informazioni di interesse e tutto il tuo calcolo sarà completamente basato sulle strutture di dati create da te. In realtà nella maggior parte delle nostre applicazioni, creiamo strutture di dati nostre che di solito non sono così complicate come l'albero del DOM. Da questo senso, penso, la possibilità di usare un parser DOM è inferiore a quella di usare un parser SAX.

Nei seguenti casi, l'utilizzo del parser DOM è vantaggioso rispetto all'utilizzo del parser SAX.

  • L'applicazione deve accedere contemporaneamente a parti del documento ampiamente separate.
  • La tua applicazione potrebbe probabilmente utilizzare una struttura di dati interna che è quasi complicata come il documento stesso.
  • L'applicazione deve modificare il documento ripetutamente.
  • L'applicazione deve archiviare il documento per un periodo di tempo significativo attraverso numerose chiamate di metodo.

Esempio (utilizzare un parser DOM o un parser SAX?):

Supponiamo che un istruttore abbia un documento XML contenente tutte le informazioni personali degli studenti, nonché i punti che i suoi studenti hanno fatto nella sua classe, e ora sta assegnando i voti finali per gli studenti usando un'applicazione. Quello che vuole produrre è un elenco con il SSN e i voti. Inoltre supponiamo che nella sua domanda, l'istruttore non utilizzi alcuna struttura di dati come array per memorizzare le informazioni personali degli studenti e i punti. Se l'istruttore decide di assegnare A a coloro che hanno guadagnato la classe media o superiore e di dare B agli altri, allora è meglio usare un parser DOM nella sua applicazione. Il motivo è che non ha modo di sapere quanto è la media della classe prima che l'intero documento venga elaborato. Quello che probabilmente deve fare nella sua domanda, è prima di tutto esaminare tutti gli studenti punti e calcolare la media, quindi rivedere il documento e assegnare il voto finale a ciascuno studente confrontando i punti guadagnati con la media della classe. Se, tuttavia, l'istruttore adotta una politica di classificazione tale che agli studenti che hanno ottenuto 90 punti o più, vengano assegnati A e agli altri vengano assegnati B, allora probabilmente sarebbe meglio usare un parser SAX. Il motivo è che, per assegnare a ogni studente un voto finale, non è necessario attendere l'elaborazione dell'intero documento. Poteva assegnare immediatamente un voto a uno studente una volta che il parser SAX ha letto il voto di questo studente. Nell'analisi sopra, abbiamo ipotizzato che l'istruttore non abbia creato una propria struttura di dati. E se crea la propria struttura di dati, come una matrice di stringhe per memorizzare il SSN e una matrice di numeri interi per conservare i punti? In questo caso, Penso che SAX sia una scelta migliore, prima che questo possa risparmiare sia memoria che tempo, ma portare a termine il lavoro. Bene, un'altra considerazione su questo esempio. Cosa succede se ciò che l'istruttore vuole fare non è stampare un elenco, ma salvare il documento originale con il voto di ogni studente aggiornato? In questo caso, un parser DOM dovrebbe essere una scelta migliore, indipendentemente dalla politica di classificazione che sta adottando. Non ha bisogno di creare una propria struttura di dati. Quello che deve fare è prima modificare l'albero DOM (ovvero, impostare il valore sul nodo 'grade') e quindi salvare l'intero albero modificato. Se sceglie di utilizzare un parser SAX anziché un parser DOM, in questo caso deve creare una struttura di dati che è quasi complicata come un albero DOM prima di poter eseguire il lavoro. ma fai il lavoro. Bene, un'altra considerazione su questo esempio. Cosa succede se ciò che l'istruttore vuole fare non è stampare un elenco, ma salvare il documento originale con il voto di ogni studente aggiornato? In questo caso, un parser DOM dovrebbe essere una scelta migliore, indipendentemente dalla politica di classificazione che sta adottando. Non ha bisogno di creare una propria struttura di dati. Quello che deve fare è prima modificare l'albero DOM (ovvero, impostare il valore sul nodo 'grade') e quindi salvare l'intero albero modificato. Se sceglie di utilizzare un parser SAX anziché un parser DOM, in questo caso deve creare una struttura di dati che è quasi complicata come un albero DOM prima di poter eseguire il lavoro. ma fai il lavoro. Bene, un'altra considerazione su questo esempio. Cosa succede se ciò che l'istruttore vuole fare non è stampare un elenco, ma salvare il documento originale con il voto di ogni studente aggiornato? In questo caso, un parser DOM dovrebbe essere una scelta migliore, indipendentemente dalla politica di classificazione che sta adottando. Non ha bisogno di creare una propria struttura di dati. Quello che deve fare è prima modificare l'albero DOM (ovvero, impostare il valore sul nodo 'grade') e quindi salvare l'intero albero modificato. Se sceglie di utilizzare un parser SAX anziché un parser DOM, in questo caso deve creare una struttura di dati che è quasi complicata come un albero DOM prima di poter eseguire il lavoro. ma per salvare il documento originale con il voto di ogni studente aggiornato? In questo caso, un parser DOM dovrebbe essere una scelta migliore, indipendentemente dalla politica di classificazione che sta adottando. Non ha bisogno di creare una propria struttura di dati. Quello che deve fare è prima modificare l'albero DOM (ovvero, impostare il valore sul nodo 'grade') e quindi salvare l'intero albero modificato. Se sceglie di utilizzare un parser SAX anziché un parser DOM, in questo caso deve creare una struttura di dati che è quasi complicata come un albero DOM prima di poter eseguire il lavoro. ma per salvare il documento originale con il voto di ogni studente aggiornato? In questo caso, un parser DOM dovrebbe essere una scelta migliore, indipendentemente dalla politica di classificazione che sta adottando. Non ha bisogno di creare una propria struttura di dati. Quello che deve fare è prima modificare l'albero DOM (ovvero, impostare il valore sul nodo 'grade') e quindi salvare l'intero albero modificato. Se sceglie di utilizzare un parser SAX anziché un parser DOM, in questo caso deve creare una struttura di dati che è quasi complicata come un albero DOM prima di poter eseguire il lavoro. nodo) e quindi salvare l'intero albero modificato. Se sceglie di utilizzare un parser SAX anziché un parser DOM, in questo caso deve creare una struttura di dati che è quasi complicata come un albero DOM prima di poter eseguire il lavoro. nodo) e quindi salvare l'intero albero modificato. Se sceglie di utilizzare un parser SAX anziché un parser DOM, in questo caso deve creare una struttura di dati che è quasi complicata come un albero DOM prima di poter eseguire il lavoro.

Un esempio

Dichiarazione del problema : scrivere un programma Java per estrarre tutte le informazioni sui cerchi che sono elementi in un determinato documento XML. Partiamo dal presupposto che ogni elemento del cerchio ha tre elementi figlio (cioè, x, y e raggio) oltre a un attributo di colore. Di seguito è riportato un documento di esempio:

<?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> 

Programma con 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);}

    }

}

Programma con 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

In pratica: 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 presenta il documento xml come la seguente struttura ad albero in memoria.
  • DOM è lo standard W3C.
  • Il parser DOM funziona su Document Object Model.
  • DOM occupa più memoria, preferita per piccoli documenti XML
  • DOM è facile da navigare in avanti o indietro.

inserisci qui la descrizione dell'immagine


  • SAX presenta il documento XML come evento basato come start element:abc,end element:abc .
  • SAX non è lo standard W3C, è stato sviluppato da un gruppo di sviluppatori.
  • SAX non utilizza memoria, preferita per documenti XML di grandi dimensioni.
  • La navigazione all'indietro non è possibile in quanto elabora i documenti in sequenza.
  • L'evento accade a un nodo / elemento e fornisce tutti i sottonodi (nodo latino, "nodo").

Questo documento XML, quando passato attraverso un parser SAX, genererà una sequenza di eventi come il seguente :

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

perché è attr: "lang"al di sopra element: <title>della rappresentazione visiva del DOM analisi? Guardando l'XML, sembra che attrdovrebbe essere parallelo al suo <element>come con <book>e category. È solo una tecnica salvaspazio o esiste una relazione genitore-figlio?
1252748,

è solo una tecnica salvaspazio
Premraj il

3

DOM sta per Document Object Model e rappresenta un documento XML in formato ad albero che ogni elemento rappresenta i rami degli alberi. DOM Parser crea una rappresentazione ad albero della memoria del file XML e quindi la analizza, quindi richiede più memoria ed è consigliabile avere una dimensione heap aumentata per il parser DOM al fine di evitare Java.lang.OutOfMemoryError: spazio heap java. L'analisi del file XML con il parser DOM è abbastanza veloce se il file XML è piccolo ma se si tenta di leggere un file XML di grandi dimensioni utilizzando il parser DOM, ci sono più possibilità che ci vorrà molto tempo o addirittura non si riesce a caricarlo completamente semplicemente perché richiede molta memoria per creare XML Dom Tree. Java fornisce supporto per l'analisi del DOM e puoi analizzare i file XML in Java usando il parser DOM. Le classi DOM sono nel pacchetto w3c.dom mentre DOM Parser per Java è nel pacchetto JAXP (API Java per XML Parsing).

Parser XML SAX in Java

Supporti SAX per API semplici per analisi XML. Si tratta di un analisi XML basata su eventi e analizza i file XML passo dopo passo, molto adatti per file XML di grandi dimensioni. Il parser XML SAX genera un evento quando ha rilevato tag di apertura, elemento o attributo e l'analisi funziona di conseguenza. Si consiglia di utilizzare il parser XML SAX per l'analisi di file XML di grandi dimensioni in Java perché non richiede il caricamento di un intero file XML in Java e può leggere un file XML di grandi dimensioni in piccole parti. Java fornisce supporto per il parser SAX e puoi analizzare qualsiasi file XML in Java usando SAX Parser, ho coperto un esempio di lettura del file xml usando SAX Parser qui. Uno svantaggio dell'uso di SAX Parser in Java è che la lettura di file XML in Java utilizzando SAX Parser richiede più codice rispetto a DOM Parser.

Differenza tra parser DOM e SAX XML

Ecco alcune differenze di alto livello tra il parser DOM e il parser SAX in Java:

1) Il parser DOM carica l'intero documento xml in memoria mentre SAX carica solo una piccola parte del file XML in memoria.

2) Il parser DOM è più veloce di SAX perché accede all'intero documento XML in memoria.

3) Il parser SAX in Java è più adatto per file XML di grandi dimensioni rispetto al parser DOM perché non richiede molta memoria.

4) Il parser DOM funziona su Document Object Model mentre SAX è un parser XML basato su eventi.

Per saperne di più: http://javarevisited.blogspot.com/2011/12/difference-between-dom-and-sax-parsers.html#ixzz2uz1bJQqZ


2

Sia SAX che DOM vengono utilizzati per analizzare il documento XML. Entrambi hanno vantaggi e svantaggi e possono essere utilizzati nella nostra programmazione a seconda della situazione

SAX:

  1. Analizza nodo per nodo

  2. Non memorizza l'XML in memoria

  3. Non è possibile inserire o eliminare un nodo

  4. Attraversamento dall'alto verso il basso

DOM

  1. Memorizza l'intero documento XML in memoria prima dell'elaborazione

  2. Occupa più memoria

  3. Siamo in grado di inserire o eliminare nodi

  4. Attraversare in qualsiasi direzione.

Se abbiamo bisogno di trovare un nodo e non abbiamo bisogno di inserire o cancellare possiamo andare con SAX stesso altrimenti DOM a condizione che abbiamo più memoria.


1

1) Il parser DOM carica l'intero documento XML in memoria mentre SAX carica solo una piccola parte del file XML in memoria.

2) Il parser DOM è più veloce di SAX perché accede all'intero documento XML in memoria.

3) Il parser SAX in Java è più adatto per file XML di grandi dimensioni rispetto al parser DOM perché non richiede molta memoria.

4) Il parser DOM funziona su Document Object Model mentre SAX è un parser XML basato su eventi.

Per saperne di più: http://javarevisited.blogspot.com/2011/12/difference-between-dom-and-sax-parsers.html#ixzz498y3vPFR

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.