2009-03-31 5 views
4

Zum Beispiel betrachten Sie das folgende XML-Wie effizient ist XPath im Vergleich zur Verwendung von DOM in Dom4J?

<root> 
    <childNode attribute1="value1"> 
    <grandChildNode attrib1="val1" attrib2="val2">some content1 
    </grandChildNode> 
    <grandChildNode attrib1="val1" attrib2="val2">some content2 
    </grandChildNode> 
    <grandChildNode attrib1="val1" attrib2="val2">some content3 
    </grandChildNode> 
    </childNode> 
    <childNode attribute1="value1"> 
    <grandChildNode attrib1="val1" attrib2="val2">some content1 
    </grandChildNode> 
    <grandChildNode attrib1="val1" attrib2="val2">some content2 
    </grandChildNode> 
    <grandChildNode attrib1="val1" attrib2="val2">some content3 
    </grandChildNode> 
    </childNode> 
    <childNode attribute1="value1"> 
    <grandChildNode attrib1="val1" attrib2="val2">some content1 
    </grandChildNode> 
    <grandChildNode attrib1="val1" attrib2="val2">some content2 
    </grandChildNode> 
    <grandChildNode attrib1="val1" attrib2="val2">some content3 
    </grandChildNode> 
    </childNode> 
</root> 

DOM das als Root-Knoten zu erhalten, dann radeln durch die childNode und grandChildNode effizienter gestaltet werden oder XPath-Ausdrücke mit den Details der Kind und Enkelkind Knoten effizient zu sammeln?

Antwort

8

Wenn Sie ein XML-Dokument in seiner Gesamtheit verarbeiten möchten, ist das Analysieren von XML in ein DOM fast immer das Geringste in Bezug auf Deserialisierungszeit, CPU-Auslastung und Speichernutzung.

Das Parsen zu einem DOM erfordert etwa 10-15 Mal die Menge an Speicher, da das XML-Dokument Speicherplatz benötigt. Ein 1-Megabyte-XML-Dokument analysiert beispielsweise ein DOM, das 10-15 Megabyte Speicher belegt.

Analysieren Sie immer nur in ein DOM, wenn Sie einige oder alle Daten ändern und das Ergebnis dann wieder in ein XML-Dokument einfügen möchten. Für alle anderen Anwendungsfälle ist DOM eine schlechte Wahl.

XPath ist oft deutlich weniger Ressourcen schwer, aber das hängt von der Länge des Dokuments ab (d. H. Wie viele 'childNode' Elemente Sie haben) und dem Speicherort der Daten, an denen Sie interessiert sind.

Die XPath-Speicherauslastung und die Abschlusszeit erhöhen sich tendenziell, je weiter Sie das Dokument verlassen. Angenommen, Sie haben ein XML-Dokument mit 20.000 childNode-Elementen, jeder childNode hat eine eindeutige Kennung, die Sie bereits kennen, und Sie möchten einen bekannten childNode aus dem Dokument extrahieren. Das Extrahieren des 18.345. ChildNode würde viel, viel, viel mehr Speicher benötigen als das Extrahieren des dritten.

Wenn Sie also XPath verwenden, um alle childNode-Elemente zu extrahieren, finden Sie es möglicherweise weniger effizient als das Parsing in ein DOM. XPath ist im Allgemeinen eine einfache Möglichkeit, einen Teil einer XML-Datei zu extrahieren. Ich würde nicht empfehlen, es für die Verarbeitung aller XML-Dokumente zu verwenden.

Mit Abstand der beste Ansatz, wenn Sie in der Tat alle Daten in einem XML-Dokument extrahieren und verarbeiten möchten, wäre die Verwendung eines SAX-basierten Readers. Dies wird sowohl um Größenordnungen schneller als auch weniger Ressourcen schwer sein als bei jedem anderen Ansatz.

Das heißt, es hängt auch von der Menge der Daten ab, mit denen Sie es zu tun haben. Für das XML-Beispieldokument, das Sie angegeben haben, werden Sie keinen praktischen Unterschied feststellen. Ja, DOM wird "langsam" sein und SAX wird "schnell" sein, aber wir sprechen von Milli- oder Mikrosekunden-Unterschieden.

SAX kann leicht Hunderte oder Tausende Male schneller als DOM sein, aber wenn das der Unterschied zwischen 2 Mikrosekunden und 2 Millisekunden ist, werden Sie nicht bemerken. Wenn Sie mit einem Dokument arbeiten, das 20.000 ChildNode-Elemente enthält, werden 2 Sekunden im Vergleich zu 200 Sekunden zu einem größeren Problem.