1. DOM (JAXP Crimson Parser)
DOM ist der offizielle W3C-Standard für die Darstellung von XML-Dokumenten auf plattform- und sprachunabhängige Weise. DOM ist eine Sammlung von Knoten oder Informationsfragmenten, die in einer Hierarchie organisiert sind. Mit dieser Hierarchie können Entwickler nach bestimmten Informationen im Baum suchen. Die Analyse dieser Struktur erfordert normalerweise das Laden des gesamten Dokuments und das Erstellen der Hierarchie, bevor eine Arbeit ausgeführt werden kann. Da es auf der Informationsebene basiert, wird das DOM als baumbasiert oder objektbasiert angesehen. DOM und verallgemeinerte baumbasierte Verarbeitung haben mehrere Vorteile. Erstens, da der Baum im Speicher anhaltend ist, kann er so geändert werden, dass die Anwendung Änderungen an Daten und Struktur vornehmen kann. Es ermöglicht Ihnen auch, jederzeit den Baum auf und ab zu navigieren, anstatt ein einmaliger Job wie SAX zu sein. DOM ist viel einfacher zu bedienen.
2. Sax
Die Vorteile der SAX -Verarbeitung sind den Vorteilen des Streaming sehr ähnlich. Die Analyse kann sofort beginnen, anstatt darauf zu warten, dass alle Daten verarbeitet werden. Und da die Anwendung die Daten beim Lesen nur überprüft, muss die Daten nicht im Speicher gespeichert werden. Dies ist ein großer Vorteil für große Dokumente. Tatsächlich muss die Anwendung nicht einmal das gesamte Dokument analysieren. Es kann aufhören zu analysieren, wenn ein bestimmter Zustand erfüllt ist. Im Allgemeinen ist SAX viel schneller als der Ersatzdom.
Wählen Sie DOM oder SAX? Für Entwickler, die ihren eigenen Code schreiben müssen, um XML -Dokumente zu verarbeiten, ist die Auswahl eines DOM- oder SAX -Parsing -Modells eine sehr wichtige Entwurfsentscheidung. DOM verwendet die Methode zum Erstellen einer Baumstruktur, um auf XML -Dokumente zuzugreifen, während SAX das Ereignismodell verwendet.
Der DOM -Parser wandelt ein XML -Dokument in einen Baum um, der seinen Inhalt enthält, und kann den Baum durchqueren. Der Vorteil eines Modells mit DOM besteht darin, dass es einfach zu programmieren ist. Entwickler müssen nur Anweisungen für Baumstellen aufrufen und dann mit Navigations-APIs auf die erforderlichen Baumknoten zugreifen, um die Aufgabe zu erledigen. Es ist einfach, Elemente im Baum hinzuzufügen und zu modifizieren. Da das gesamte XML -Dokument bei Verwendung des DOM -Parsers verarbeitet werden muss, sind die Leistungs- und Speicheranforderungen relativ hoch, insbesondere bei der Begegnung mit großer XML -Dateien. Aufgrund seiner Traversalfunktionen werden DOM -Parser häufig in Diensten verwendet, in denen XML -Dokumente häufige Änderungen erfordern.
Der SAX-Parser nimmt ein ereignisbasiertes Modell an. Es kann eine Reihe von Ereignissen auslösen, wenn ein XML -Dokument analysiert wird. Wenn ein bestimmtes Tag gefunden wird, kann es eine Rückrufmethode aktivieren, um die Methode zu ermitteln, die das Tag gefunden hat. SAX benötigt normalerweise einen geringen Speicher, da Entwickler die Tags entscheiden können, die sie verarbeiten möchten. Insbesondere wenn Entwickler nur einen Teil der im Dokument enthaltenen Daten verarbeiten müssen, spiegelt sich die Expansionsfähigkeit von SAX besser aus. Die Codierung ist jedoch schwierig, wenn Sie SAX -Parser verwenden, und es ist schwierig, im selben Dokument gleichzeitig auf mehrere verschiedene Daten zuzugreifen.
3. Jdom http://www.jdom.org
Der Zweck von JDOM ist es, ein Java-spezifisches Dokumentmodell zu sein, das die Interaktion mit XML vereinfacht und schneller als die Verwendung von DOM ist. Da es das erste Java-spezifische Modell ist, wurde JDOM energisch gefördert und gefördert. Wenn Sie in Betracht ziehen, es als "Java Standard-Erweiterung" über "Java-Spezifikationsanforderung JSR-102" zu verwenden. Die JDOM -Entwicklung wurde seit Anfang 2000 begonnen.
Jdom und Dom unterscheiden sich hauptsächlich in zwei Aspekten. Erstens verwendet JDOM nur Betonklassen und nicht Schnittstellen. Dies vereinfacht die API in gewisser Weise, begrenzt aber auch die Flexibilität. Zweitens verwendet die API eine große Anzahl von Sammlungsklassen, um die Verwendung von Java -Entwicklern zu vereinfachen, die bereits mit diesen Klassen vertraut sind.
In der JDOM -Dokumentation geht hervor, dass ihr Ziel darin besteht, "20% (oder weniger) Anstrengungen zu verwenden, um 80% (oder mehr) Java/XML -Probleme zu lösen" (angenommen als 20% basierend auf der Lernkurve). JDOM ist natürlich für die meisten Java/XML -Anwendungen nützlich, und die meisten Entwickler finden APIs viel einfacher zu verstehen als DOM. JDOM enthält auch ziemlich umfangreiche Überprüfungen über das Programmverhalten, um zu verhindern, dass Benutzer in XML etwas bedeutungsloses tun. Es erfordert jedoch immer noch, dass Sie XML vollständig verstehen, um etwas über die Grundlagen hinaus zu tun (oder in einigen Fällen Fehler sogar zu verstehen). Dies kann ein sinnvollerer Job sein, als eine DOM- oder JDOM -Schnittstelle zu lernen.
Jdom selbst enthält keinen Parser. In der Regel wird ein SAX2 -Parser verwendet, um Eingabe -XML -Dokumente zu analysieren und zu validieren (obwohl es auch zuvor konstruierte DOM -Darstellungen als Eingabe annehmen kann). Es enthält einige Konverter, um JDOM -Darstellungen in SAX2 -Ereignisströme, DOM -Modelle oder XML -Textdokumente auszugeben. Jdom ist Open Source, das unter der Apache -Lizenzvariante veröffentlicht wurde.
4. DOM4J http://dom4j.sourceforge.net
Obwohl DOM4J ein völlig unabhängiges Entwicklungsergebnis darstellt, war es zunächst ein intelligenter Zweig von JDOM. Es enthält viele Funktionen, die über grundlegende XML-Dokumentendarstellungen hinausgehen, einschließlich integrierter XPath-Unterstützung, XML-Schemaunterstützung und ereignisbasierter Verarbeitung für große oder gestreamte Dokumente. Es bietet außerdem die Möglichkeit, eine Dokumentendarstellung zu erstellen, die über die DOM4J -API und die Standard -DOM -Schnittstelle einen parallelen Zugriff aufweist. Es befindet sich seit der zweiten Hälfte des Jahres 2000.
Um all diese Funktionen zu unterstützen, verwendet DOM4J Schnittstellen und abstrakte Basisklassenmethoden. DOM4J verwendet die Sammlungsklasse in der API ausführlich, bietet jedoch in vielen Fällen auch einige Alternativen, um eine bessere Leistung oder eine einfachere Codierungsmethode zu ermöglichen. Der direkte Vorteil ist, dass DOM4J zwar den Preis einer komplexeren API zahlt, aber viel größere Flexibilität als JDOM bietet.
Wenn DOM4J Flexibilität, XPath -Integration und die Ziele der großen Dokumentenverarbeitung hinzufügen, ist DOM4J mit JDOM dieselbe: Benutzerfreundlichkeit und intuitiver Betrieb für Java -Entwickler. Es ist auch verpflichtet, eine vollständigere Lösung als JDOM zu werden und das Ziel zu erreichen, mit allen Java/XML -Problemen in der Natur umzugehen. Wenn dieses Ziel vervollständigt wird, betont es weniger Wert darauf, falsches Anwendungsverhalten zu verhindern als JDOM.
DOM4J ist eine sehr, sehr ausgezeichnete Java XML -API mit hervorragender Leistung, leistungsstarker Funktionen und äußerst einfach zu bedienen. Es ist auch eine Open -Source -Software. Heutzutage können Sie sehen, dass immer mehr Java -Software DOM4J zum Lesen und Schreiben von XML verwendet. Es ist besonders erwähnenswert, dass selbst Suns Jaxm DOM4J verwendet.
Vergleich der vier Methoden
DOM4J hat die beste Leistung und sogar Suns Jaxm verwendet DOM4J. Gegenwärtig verwenden viele Open -Source -Projekte DOM4J in großen Mengen, wie zum Beispiel der berühmte Hibernate verwendet DOM4J, um XML -Konfigurationsdateien zu lesen. Wenn keine Portabilität berücksichtigt wird, wird DOM4J verwendet.
JDOM und DOM werden während der Leistungstests schlecht abschneiden und beim Testen von 10 -m -Dokumenten Speicherüberflutung. Es lohnt sich auch, DOM und JDOM im Fall einer kleinen Dokumentation zu berücksichtigen. Während JDOM -Entwickler erklärt haben, dass sie sich vor der offiziellen Veröffentlichung auf Leistungsprobleme konzentrieren werden, empfiehlt es sich wirklich nicht wirklich. Darüber hinaus ist DOM immer noch eine sehr gute Wahl. Die DOM -Implementierung wird in einer Vielzahl von Programmiersprachen häufig verwendet. Es ist auch die Grundlage für viele andere XML-bezogene Standards, da es offiziell W3C-Empfehlungen ist (im Gegensatz zu nicht standardmäßigen Java-Modellen), daher kann es auch in einigen Arten von Projekten erforderlich sein (z. B. die Verwendung von DOM in JavaScript).
SAX funktioniert besser, was von seiner spezifischen Parsingmethode abhängt - ereignisgesteuert. Ein SAX erkennt einen bevorstehenden XML -Stream, wird jedoch nicht in den Speicher geladen (wenn der XML -Stream gelesen wird, werden einige Dokumente natürlich vorübergehend im Speicher versteckt).
Grundlegende Verwendung von vier XML -Betriebsmethoden
XML -Datei:
<? XML Version = "1.0" coding = "gb2312"?> < Ergebnis> < Wert> < no> a1234 </no> < addr> Nr. Xx Abschnitt XX Road, xx Stadt, xx County, Soichuan Provinz </addr> </value> < value> < value> < No> < < adr. Provinz </addr> </value> </result >
1) DOM -Implementierungsmethode
Java.io importieren.*; import Java.util.*; import org.w3c.dom. try {Datei f = neue Datei ("data_10k.xml"); DocumentBuilderFactory Factory = DocumentBuilderFactory.Newinstance (); DocumentBuilder builder = factory.newdocumentBuilder (); Dokument doc = builder.Parse (f); Nodelist nl = doc.getElementsByTagName ("value"); für (int i = 0; i < nl.getLength (); i ++) {System.out.print ("Nummernschildnummer:"+doc.getElementsByTagName ("no"). itsel (i) .getFirstchild (). getNoDeValue ()); System.out.println ("Eigentümeradresse:" + doc.getElementsByTagName ("addr"). Artikel (i) .GetFirstchild (). GetNodeValue ()); }} catch (Ausnahme e) {e.printstacktrace ();} 2) SAX -Implementierungsmethode
import org.xml.sax.*; import org.xml.sax.helpers.*; import javax.xml.parsers. public myxmlReader () {Super ();} public static void main (String args []) {long desting = system.currentTimemillis (); try {SAXPARSERFAKTORY SF = SAXPARSERFACTORY.NEWINSTANCE (); Saxparser sp = sf.newsaxparser (); Myxmlreader reader = new myxmlreader (); sp.Parse (neue InputSource ("data_10k.xml"), Leser); } catch (Ausnahme e) {e.printstacktrace (); } System.out.println ("Laufzeit:" + (System.currentTimemillis () - dauerhaft) + "Milliseconds");} public void Zeichen (char ch [], int start, int länge) löst SaxException {String tag = (String) tags.peek (); if (tag.equals("NO")) { System.out.print("licence plate number: " + new String(ch, start, length));}if (tag.equals("ADDR")) { System.out.println("Address:" + new String(ch, start, length));}} public void startElement(String uri,String localName,String qName,Attributes attrs) { tags.push (qname);}} 3) JDOM -Implementierungsmethode
Java.io importieren.*; import Java.util.*; import org.jdom. probieren {saxbuilder builder = new SaxBuilder (); Document doc = builder.build (neue Datei ("data_10k.xml")); Element foo = doc.getrootelement (); Listen allchildren = foo.getChildren (); für (int i = 0; i < allchildren.size (); i ++) {System.out.print ("Nummernschildnummer:"+((Element) Allchildren.get (i)). getChild ("no"). getText ()); System.out.println ("Eigentümeradresse:" + ((Element) Allchildren.get (i)). GetChild ("addr"). GetText ()); }} catch (Ausnahme e) {e.printstacktrace ();}} 4) DOM4J -Implementierungsmethode
Import Java.io.*; Import Java.util.*; import org.dom4j. try {Datei f = neue Datei ("data_10k.xml"); SaxReader Reader = neuer Saxreader (); Dokument doc = reader.read (f); Element root = doc.getrootelement (); Element Foo; für (iterator i = root.elementiterator ("value"); i.hasnext () {foo = (Element) I.Next (); System.out.print ("Nummernschildnummer:" + foo.elementText ("no"); E. printstacktrace ();})