Bester XML-Parser für Java [geschlossen]

387

Ich muss kleinere (höchstens wenige MB, UTF-8-codierte) XML-Dateien lesen, verschiedene Elemente und Attribute durchsuchen, möglicherweise einige ändern und das XML wieder auf die Festplatte schreiben (vorzugsweise mit netter, eingerückter Formatierung). .

Was wäre der beste XML-Parser für meine Anforderungen? Es gibt viele zur Auswahl. Einige, die mir bekannt sind, sind:

Und natürlich die im JDK (ich benutze Java 6). Ich bin mit Xerces vertraut, finde es aber klobig.

Empfehlungen?

Evan
quelle
6
Ich denke, Sie können mehr Spieler hier finden: xml.com/lpt/a/1703
dma_k
1
Ich denke, es gibt echte Probleme mit dieser Frage. 1 ist, dass es völlig andere Dinge vergleicht, Parser (xerces, purpurrot) mit dom-Manipulationsbibliotheken (dom4j, xom, jdom) zusammenfasst. Auch die Antworten tendieren zur Anwaltschaft und sind nicht so konstruktiv.
Nathan Hughes
51
+220 und nicht konstruktiv. Offensichtlich haben Moderatoren und Benutzer unterschiedliche Sichtweisen auf das Konstruktive.
Tbroberg
5
Ja, es scheint, dass Mods kurzsichtig sind, wenn es um solche Fragen geht. Ja, die Antworten würden eine Meinung sein, aber definitiv basierend auf der Erfahrung und meistens werden die Antworten quantifiziert. Mods müssen wahrscheinlich ein anderes Tag erstellen, um diese Fragen zu verschieben, die zur Diskussion stehen, was zu konstruktiver Kritik und Ergebnissen führt.
Ashraff Ali Wahab
@dma_k dein Link funktioniert nicht.
Gaurav

Antworten:

81

Wenn Geschwindigkeit und Speicher kein Problem sind, ist dom4j eine wirklich gute Option. Wenn Sie Geschwindigkeit benötigen, ist die Verwendung eines StAX-Parsers wie Woodstox der richtige Weg, aber Sie müssen mehr Code schreiben, um die Dinge zu erledigen, und Sie müssen sich daran gewöhnen, XML in Streams zu verarbeiten.

Zehrer
quelle
6
dom4j ist ziemlich gut, aber definitiv nicht ohne Probleme. Gute dom4j-Alternativen finden Sie unter stackoverflow.com/questions/831865/…
Jonik
@zehrer sind sie threadsicher?
Gaurav
257

Ich denke, Sie sollten keine bestimmte Parser-Implementierung in Betracht ziehen. Mit der Java-API für die XML-Verarbeitung können Sie jede konforme Parser-Implementierung auf standardmäßige Weise verwenden. Der Code sollte viel portabler sein. Wenn Sie feststellen, dass ein bestimmter Parser zu alt geworden ist, können Sie ihn durch einen anderen ersetzen, ohne eine Codezeile zu ändern (wenn Sie dies richtig machen).

Grundsätzlich gibt es drei Möglichkeiten, XML standardmäßig zu behandeln:

  • SAX Dies ist die einfachste API. Sie lesen das XML, indem Sie eine Handler-Klasse definieren, die die Daten in Elementen / Attributen empfängt, wenn das XML seriell verarbeitet wird. Es ist schneller und einfacher, wenn Sie nur einige Attribute / Elemente lesen und / oder einige Werte zurückschreiben möchten (Ihr Fall).
  • DOM Diese Methode erstellt einen Objektbaum, mit dem Sie ihn nach dem Zufallsprinzip ändern / darauf zugreifen können, damit er besser für komplexe XML-Manipulationen und -Handhabungen geeignet ist.
  • STAX Dies ist in der Mitte des Pfades zwischen SAX und DOM. Sie schreiben einfach Code, um die Daten aus dem Parser abzurufen, an dem Sie interessiert sind, wenn sie verarbeitet werden.

Vergessen Sie proprietäre APIs wie JDOM- oder Apache-APIs (z. B. Apache Xerces XMLSerializer ), da Sie an eine bestimmte Implementierung gebunden sind , die sich im Laufe der Zeit weiterentwickeln oder die Abwärtskompatibilität verlieren kann, sodass Sie Ihren Code in Zukunft ändern können, wenn Sie ein Upgrade durchführen möchten eine neue Version von JDOM oder einem von Ihnen verwendeten Parser. Wenn Sie sich an die Java-Standard-API halten (mithilfe von Fabriken und Schnittstellen), ist Ihr Code wesentlich modularer und wartbarer.

Es muss nicht gesagt werden, dass alle (ich habe nicht alle überprüft, aber ich bin mir fast sicher) der vorgeschlagenen Parser einer JAXP-Implementierung entsprechen, sodass Sie technisch alle verwenden können, egal welche.

Fernando Miguélez
quelle
11
Eigentlich drei Möglichkeiten: StAX (javax.xml.stream) ist der dritte Standard.
StaxMan
1
java-samples.com/showtutorial.php?tutorialid=152 (persönlich liebe SAX)
Kitokid
@kitokid Chrome sagt mir, dass auf dieser Seite böse Sachen sind. Ich habe dies stattdessen verwendet: sce.uhcl.edu/yue/courses/xml/notes/xmlparser/IntroDOM.asp
Ryan Shillington
Guter Überblick: Nur eines würde ich nicht zustimmen - während für Inkremental / Streaming SAX und Stax gut sind, Standard-API ausreichend, für DOM ist dies nicht der Fall (IMO): Es gibt gültige Gründe für Java-spezifische Takes wie XOM, JDOM und DOM4J: Sprachunabhängiges DOM ist ziemlich umständlich zu verwenden.
StaxMan
130

Hier ist ein schöner Vergleich zu DOM, SAX, StAX & TrAX (Quelle: http://download.oracle.com/docs/cd/E17802_01/webservices/webservices/docs/1.6/tutorial/doc/SJSXP2.html )

Feature StAX SAX DOM TrAX

API-Typ                 Pull, Streaming Push, Streaming Im Speicherbaum XSLT-Regel

Benutzerfreundlichkeit           Hoch Mittel Hoch Mittel

XPath-Fähigkeit    Nein Nein Ja Ja

CPU & Speicher     Gut Gut Variiert Variiert

Nur        weiterleiten Ja Ja Nein Nein

XML lesen              Ja Ja Ja Ja

XML schreiben              Ja Nein Ja Ja

CRUD                      Nein Nein Ja Nein

Kadir
quelle
7
Sie können XML mit SAX schreiben. Die Senke bietet eine Handler-Implementierung, bei der der Benutzer SAX-Ereignisse aufrufen kann, um eine XML-Ausgabe zu generieren. (Ich sehe, dass die Tabelle stammt und kein Originalmaterial, die Tabelle ist jedoch falsch)
Dev
4

Zusätzlich zu SAX und DOM ist STaX-Parsing mit XMLStreamReader verfügbar, einem XML-Pull-Parser.


quelle
3

Ich habe festgestellt, dass dom4j das Werkzeug für die Arbeit mit XML ist. Besonders im Vergleich zu Xerces.

Brian Matthews
quelle
2

Ich würde nicht empfehlen, dass Sie viel "Nachdenken" in Ihrer App haben, aber die Verwendung von XSLT könnte besser (und möglicherweise schneller bei der Kompilierung von XSLT zu Bytecode) sein als die Java-Manipulation.


quelle
3
Besser, möglich: schneller, sehr unwahrscheinlich.
StaxMan
Das Lesen, Bearbeiten und Schreiben von XML ist genau das, wofür XSLT entwickelt wurde. Dies ist eine nette, sofort einsatzbereite Antwort.
James.garriss
1

Wenn Sie sich weniger für die Leistung interessieren, bin ich ein großer Fan von Apache Digester, da Sie damit im Wesentlichen direkt von XML auf Java Beans abbilden können.

Andernfalls müssen Sie zuerst Ihre Objekte analysieren und dann konstruieren.

Uri
quelle
Ich muss keine Java-Beans erstellen, nur die XML-Rohelemente ein wenig bearbeiten und bestimmte Elemente überprüfen, um Daten von ihnen zu erhalten. Daher ist ein Parser im DOM-Stil wahrscheinlich meine ideale Lösung.
Evan
Ja, dom4j wäre dort wahrscheinlich eine bessere Lösung ... Ich habe es früher häufig benutzt, bis ich eine Stufe höher zum Fermenter gegangen bin
Uri