Welche Java XML-Bibliothek empfehlen Sie (um dom4j zu ersetzen)? [geschlossen]

76

Ich suche nach etwas wie dom4j, aber ohne die Warzen von dom4j, wie schlechte oder fehlende Dokumentation und scheinbar ins Stocken geratener Entwicklungsstatus.

Hintergrund: Ich habe dom4j verwendet und befürwortet , fühle mich aber nicht ganz richtig, da ich weiß, dass die Bibliothek bei weitem nicht optimal ist (Beispiel: Sehen Sie, wie Methoden in der XSLT-bezogenen Stylesheet- Klasse dokumentiert sind; was würden Sie zum Ausführen übergeben () ) als String modeParameter?)

Anforderungen: Die Bibliothek sollte die grundlegende XML-Handhabung einfacher machen als bei Verwendung von reinem JDK ( javax.xmlund org.w3c.domPaketen). Dinge wie dieses:

  • Lesen Sie ein XML-Dokument (aus einer Datei oder einem String) in ein Objekt, durchlaufen und bearbeiten Sie das DOM einfach, führen Sie XPath-Abfragen durch und führen Sie XSLT dagegen aus.
  • Erstellen Sie ein XML-Dokument in Ihrem Java-Code, fügen Sie Elemente, Attribute und Daten hinzu und schreiben Sie das Dokument schließlich in eine Datei oder einen String.

Mir gefällt wirklich, was dom4j verspricht : " Einfach zu bedienende Open-Source-Bibliothek für die Arbeit mit XML, XPath und XSLT [...] mit voller Unterstützung für DOM, SAX und JAXP. " Und das kommende dom4j 2.0 behauptet, alles zu reparieren : Java 5 vollständig nutzen und fehlende Dokumentation hinzufügen. Aber leider, wenn Sie genauer hinschauen :

Warnung: dom4j 2.0 befindet sich im Pre-Alpha-Stadium. Es ist wahrscheinlich, dass es nicht kompiliert werden kann. Falls es zufällig kompiliert werden kann, ist es wahrscheinlich, dass es nicht ausgeführt werden kann. Falls es gelegentlich läuft, kann es plötzlich explodieren. Wenn Sie dom4j verwenden möchten, benötigen Sie Version 1.6.1. Ja wirklich.

... und die Website hat das schon lange gesagt . Gibt es also eine gute Alternative zu dom4j? Bitte begründen Sie Ihre bevorzugte Bibliothek, anstatt nur Namen und Links zu speichern. :-)

Jonik
quelle
6
Es scheint, dass sie die Domain dom4j.org verloren haben (vielleicht ein weiteres Zeichen dafür, dass man sie tatsächlich durch etwas ersetzen sollte ...) - die Website ist jedoch weiterhin unter dom4j.sourceforge.net verfügbar .
Jonik
2
Überprüfen Sie einige weitere Beiträge zum Thema: stackoverflow.com/questions/373833/best-xml-parser-for-java und stackoverflow.com/questions/25614/… . Auch eine nette Anmerkung zu jdom / dom4j / xom ist hier: lists.xml.org/archives/xml-dev/200410/msg00492.html
dma_k
Oh, ich habe gerade bemerkt, dass es endlich eine Alpha-Version von dom4j 2.0 gibt: sourceforge.net/projects/dom4j/files/dom4j-2.0.0-ALPHA-2 (Sie haben ihre dom4j.org- Domain jedoch immer noch nicht wiederhergestellt .) Jemand hat es versucht aus?
Jonik
@ vtd-xml. Nein, ich hatte noch nichts davon gehört ... Erwägen Sie, eine vollständige Antwort darauf zu veröffentlichen, wenn Sie der Meinung sind, dass es sich um einen guten dom4j-Ersatz handelt, wie in der Frage
dargelegt
Eine andere Möglichkeit ist, dass Sie dem dom4j-Team jederzeit helfen können, ein besseres dom4j zu erstellen. Nimm eine Gabel und tauche ein und reiche ein paar Patches ein.
Adam Gent

Antworten:

53

Klar, XOM :-)

XOM ist leicht zu erlernen und zu bedienen. Es funktioniert sehr einfach und hat eine sehr flache Lernkurve. Vorausgesetzt, Sie sind bereits mit XML vertraut, sollten Sie in der Lage sein, XOM sehr schnell einsatzbereit zu machen.

Ich benutze XOM seit einigen Jahren und es gefällt mir immer noch sehr gut. Einfach zu bedienen, viele Dokumentationen und Artikel im Web, API ändert sich zwischen den Releases nicht. 1.2 wurde kürzlich veröffentlicht.

XOM ist die einzige XML-API, die keine Kompromisse bei der Korrektheit eingeht. XOM akzeptiert nur wohlgeformte XML-Dokumente im Namespace und ermöglicht nur die Erstellung wohlgeformter XML-Dokumente im Namespace. (Tatsächlich ist es etwas strenger: Es garantiert, dass alle Dokumente rund umlaufbar sind und genau definierte XML-Infosets haben.) XOM verwaltet Ihr XML, sodass Sie es nicht müssen. Mit XOM können Sie sich auf den einzigartigen Wert Ihrer Anwendung konzentrieren und darauf vertrauen, dass XOM das richtige XML liefert.

Auf der Webseite http://www.xom.nu/ finden Sie häufig gestellte Fragen, Kochbücher, Designgründe usw. Wenn nur alles mit so viel Liebe entworfen wurde :-)

Der Autor schrieb auch darüber, was mit XML-APIs nicht stimmt (und wie man sie behebt) . (Grundsätzlich Gründe, warum XOM überhaupt existiert)

Hier ist auch ein 5-teiliges Artima-Interview mit dem Autor über XOM, in dem sie darüber sprechen, was mit XML-APIs , The Good , The Bad und DOM , einer Entwurfsüberprüfung von JDOM , Lessons Learned from JDOM und schließlich Design Principles und XOM nicht stimmt .

Peter Štibraný
quelle
XOM sieht vielversprechend aus, insbesondere wenn man bedenkt, dass sein Entwickler die vorhandenen Bibliotheken sehr gut kannte und versuchte, sie zu verbessern. Im Vergleich zu dom4j und JDOM scheint es auch etwas aktiver zu sein: Die neueste Version war im März 2009 (obwohl die vorherige im August 2006 war). Ich probiere eines Tages XOM aus, um zu sehen, ob ich es wirklich mit ähnlicher oder größerer Leichtigkeit wie dom4j verwenden kann.
Jonik
Okay, ich habe XOM getestet (mithilfe von Stack Overflow, um nette kleine Probleme zu lösen: stackoverflow.com/questions/883987/… , stackoverflow.com/questions/428073/… , stackoverflow.com/questions/139076/ … Usw. :-) und ich fange an zu überzeugen, dass ich mit XOM so ziemlich alles machen kann, was ich mit dom4j machen kann!
Jonik
(Fortsetzung) Eine Sache, an der ich Zweifel habe, ist das Streaming von XML-Daten, was ich zuvor mit dom4j gemacht habe. Hier ist eine Frage, die ich darüber geschrieben habe. Vielleicht kennen Sie die Antwort? stackoverflow.com/questions/967288/…
Jonik
11
In acht nehmen. Dom4j / jdom in XOM umzuwandeln ist ein Schmerz im Arsch. Darüber hinaus unterstützt die API keine Java-Sammlungen. Beides sind sehr wunde Punkte.
Gili
4
Nur um meine Meinung hinzuzufügen, nachdem ich ein bisschen mit XOM gearbeitet habe. Auf jeden Fall ist es besser als JDOM. Aber es fehlt bestimmte Zucker Features, die Ich mag würde in XML - API , um zu sehen ( Element.setAttribute(name, value), Element.setText(string), Besuchermuster (siehe lists.ibiblio.org/pipermail/xom-interest/2010-March/004076.html ), besser StAX / TrAX API - Unterstützung ), die dom4j hat.
dma_k
18

Der in das JDK eingebaute ... mit ein paar Ergänzungen.

Ja, die Verwendung ist schmerzhaft: Es basiert auf W3C-Spezifikationen, die vom Ausschuss klar entworfen wurden. Es ist jedoch überall verfügbar, und wenn Sie sich darauf festlegen, stoßen Sie nicht auf die Argumente "Ich mag Dom4J", "Ich mag JDOM" und "Ich mag StringBuffer", die aus Bibliotheken von Drittanbietern stammen. Zumal solche Argumente mit unterschiedlichen Bibliotheken in unterschiedliche Codeteile umgewandelt werden können ...

Wie gesagt, ich verbessere mich jedoch geringfügig: Die Practical XML- Bibliothek ist eine Sammlung von Dienstprogrammklassen, die die Arbeit mit dem DOM erleichtern . Abgesehen vom XPath-Wrapper gibt es hier nichts Komplexes, nur eine Reihe von Routinen, die ich für jeden Job neu geschrieben habe.

kdgregory
quelle
2
Genau. Früher habe ich auf JDom geschworen, aber als ich ein paar Hilfsmethoden geschrieben habe, ist das JAX-P-Zeug einfach nicht schwieriger und überall installiert.
Dave Ray
1
JAXB ist auch eingebaut und ziemlich nett.
Adam Gent
10

Ich habe XMLTool verwendet zum Ersetzen von Dom4j verwendet und es funktioniert ziemlich gut.

Das XML-Tool verwendet das Fluent Interface-Muster, um XML-Manipulationen zu erleichtern:

XMLTag tag = XMLDoc.newDocument(false)
   .addDefaultNamespace("http://www.w3.org/2002/06/xhtml2/")
   .addNamespace("wicket", "http://wicket.sourceforge.net/wicket-1.0")
   .addRoot("html")
   .addTag("wicket:border")
   .gotoRoot().addTag("head")
   .addNamespace("other", "http://other-ns.com")
   .gotoRoot().addTag("other:foo");
System.out.println(tag.toString());

Es wurde für Java 5 entwickelt und es ist einfach, ein iterierbares Objekt über ausgewählten Elementen zu erstellen:

for (XMLTag xmlTag : tag.getChilds()) {
   System.out.println(xmlTag.getCurrentTagName());
}
Gilberto Olimpio
quelle
Das sieht fantastisch aus, genau das, was ich brauche, um einige datengesteuerte Tests zu unterstützen.
FDM
6

Ich habe Jdom immer gemocht . Es wurde geschrieben, um intuitiver zu sein als das DOM-Parsen (und das SAX-Parsen scheint sowieso immer ungeschickt zu sein).

Aus dem Leitbild:

Es gibt keinen zwingenden Grund für eine Java-API, XML so zu manipulieren, dass es komplex, knifflig, nicht intuitiv oder schmerzhaft ist. JDOMTM ist sowohl Java-zentriert als auch Java-optimiert. Es verhält sich wie Java, verwendet Java-Sammlungen, ist eine völlig natürliche API für aktuelle Java-Entwickler und bietet einen kostengünstigen Einstiegspunkt für die Verwendung von XML.

Das war so ziemlich meine Erfahrung - ziemlich intuitive Navigation von Knotenbäumen.

Steve B.
quelle
Cool. Hast du den letzten Satz meiner Frage gelesen? ;-)
Jonik
+1 - Einfacher als all das W3C-Zeug.
Duffymo
2
Ich habe JDOM kürzlich für ein Projekt verwendet, und obwohl die API intuitiv ist, habe ich zwei Probleme damit: Die Entwicklung scheint ins Stocken geraten zu sein (letztes Update war Ende 2007) und die Bibliothek wurde noch nicht generiert.
CDMckay
1
Wenn ich JDOM vs. XOM wähle, wähle ich XOM.
dma_k
3
Es sieht so aus, als ob JDOM 2.0.0 gerade veröffentlicht wurde : "2.0.0 bringt JDOM in die Welt der Generika und anderer Java-Sprachelemente, die mit Java 5 eingeführt wurden."
Jonik
5

Ich verwende XStream , eine einfache Bibliothek, um Objekte in XML und wieder zurück zu serialisieren.

Es kann annotationsgesteuert sein (wie JAXB), aber es hat eine sehr einfache und benutzerfreundliche API und Sie können sogar JSON generieren.

IAdapter
quelle
Scheint sehr einfach. Ich frage mich nur, wie es tatsächlich funktioniert: Wenn ich ein XML aus dem Internet heruntergeladen habe, woher weiß XStream, für welche Klasse es deserialisiert werden soll?
ettore
@ettore nein. Sie sollten JAXB für so etwas verwenden, da es Schema und WSDL versteht.
Adam Gent
1
Nicht wirklich eine Alternative für eine Allzweck-XML-API wie dom4j. Es ist nur ein Serializer / Deserializer, nicht wahr?
Zehrer
3

Ich werde die eingebaute Antwort von @kdgregory ergänzen, indem ich sage, warum nicht JAXB?

Mit ein paar Anmerkungen ist es ziemlich einfach, die meisten XML-Dokumente zu modellieren. Ich meine, du wirst wahrscheinlich das Zeug analysieren und ein Objekt einfügen, oder?

JAXB 2.0 ist in JDK 1.6 integriert und im Gegensatz zu vielen anderen integrierten Javax-Bibliotheken ist diese ziemlich gut (Kohusuke hat daran gearbeitet, damit Sie wissen, dass es gut ist).

Adam Gent
quelle
Ich frage mich, wie JAXB 2.0 im Vergleich zu einer leichtgewichtigen, auf Anmerkungen basierenden XML-Bibliothek wie Simple in Bezug auf Einfachheit und Vermeidung von Boilerplate verglichen werden kann . (Damals, als ich diese Frage stellte, habe ich JAXB irgendwie verpasst, aber ich denke, es verdient einen genaueren Blick, wenn man XML mit Java machen muss.)
Jonik
3

In einem kürzlich durchgeführten Projekt musste ich einige XML-Analysen durchführen und verwendete schließlich Simple Framework , das von einem Kollegen empfohlen wurde.

Ich war am Ende ziemlich zufrieden damit. Es verwendet einen annotationsbasierten Ansatz zum Zuordnen von XML-Elementen und -Attributen zu Java-Klassen und -Feldern.

<example>
  <a>
    <b>
      <x>foo</x>
    </b>
    <b>
      <y>bar</y>
    </b>
  </a>
</example>

Entsprechender Java-Code:

@Root
public class Example {

   @Path("a/b[1]")
   @Element
   private String x;

   @Path("a/b[2]")
   @Element
   private String y;
}

Es ist alles ganz anders als bei dom4j oder XOM. Sie vermeiden es, albernen XML-Code zu schreiben, aber zunächst werden Sie wahrscheinlich eine Weile mit dem Kopf gegen eine Wand schlagen, um die richtigen Anmerkungen zu erhalten.

(Ich war es, der diese Frage vor 4 Jahren gestellt hat. Obwohl XOM ein anständiger und sehr beliebter dom4j-Ersatz zu sein scheint, bin ich nicht dazu gekommen, sie vollständig zu akzeptieren. Neugierig, dass hier niemand Simple Framework erwähnt hat. Ich habe beschlossen, das zu beheben. wie ich es wahrscheinlich wieder benutzen würde.)

Jonik
quelle
1

In unserem Projekt verwenden wir http://www.castor.org/, jedoch nur für kleine XML-Dateien. Es ist wirklich einfach zu erlernen, benötigt nur eine Mapping-XML-Datei (oder keine, wenn die XML-Tags perfekt mit Klassenattributen übereinstimmen) und fertig. Es unterstützt Listener (wie Rückrufe), um zusätzliche Verarbeitung durchzuführen. Die Nachteile: Es ist kein Java EE-Standard wie JAXB.

Lluis Martinez
quelle
Castor unterstützt JAXB jedoch. Sie haben die Wahl, eine Zuordnungsdatei oder ein XML-Schema und den Codegenerator von Castor zu verwenden.
Eddie
Ich wusste es nicht, danke für die Info!
Lluis Martinez
0

Ich verwende manchmal Jericho , das hauptsächlich HTML-Parser ist, aber jede XML-ähnliche Struktur analysieren kann.

Natürlich nur für die einfachsten XML-Operationen, z. B. das Auffinden von Tags mit einem bestimmten Namen, das Durchlaufen der Struktur, das Ersetzen von Tags und deren Attributen. Sind dies jedoch nicht die häufigsten Anwendungsfälle?

Donau-Seemann
quelle
0

Zum Erstellen von XML-Dokumenten empfehle ich xmlenc . Es wird in Cassandra verwendet .

Jingguo Yao
quelle
Was sind die Stärken dieses Tools?
James.garriss