Welches ist die beste Bibliothek für XML-Parsing in Java [geschlossen]

158

Ich suche in der Java-Bibliothek nach dem Parsen von XML (komplexe Konfigurations- und Datendateien). Ich habe ein bisschen gegoogelt, konnte aber nichts anderes als dom4j finden (Scheint, als würden sie an V2 arbeiten). Ich habe mir die Commons-Konfiguration angesehen, aber nicht Andere Apache-Projekte in XML scheinen sich im Ruhezustand zu befinden. Ich habe dom4j nicht selbst evaluiert, wollte aber nur wissen, ob Java andere (gute) Open-Source-XML-Parsing-Bibliotheken hat. und wie ist deine erfahrung mit dom4j?

Lassen Sie mich nach der Antwort von @ Voo eine andere fragen: Soll ich die in Java integrierten Klassen oder eine Drittanbieter-Bibliothek wie dom4j verwenden? Was sind die Vorteile?

Premraj
quelle
Kannst du gut definieren? Leistung, Qualität der API, noch etwas?
Yishai
Leistung und Benutzerfreundlichkeit (ja, Qualität der API)
Premraj
3
Sie haben keine spezifischen Gründe für die Nichtverwendung der nativen Implementierungen von Java angegeben.
Luftkissenfahrzeug voller Aale
vtd-xml ist derjenige, der hinsichtlich Leistung / Speichernutzung und Benutzerfreundlichkeit zu übertreffen ist.
vtd-xml-author

Antworten:

213

Tatsächlich unterstützt Java 4 Methoden, um XML sofort zu analysieren:

DOM-Parser / Builder: Die gesamte XML-Struktur wird in den Speicher geladen, und Sie können die bekannten DOM-Methoden verwenden, um damit zu arbeiten. Mit DOM können Sie auch mit Xslt-Transformationen in das Dokument schreiben. Beispiel:

public static void parse() throws ParserConfigurationException, IOException, SAXException {
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    factory.setValidating(true);
    factory.setIgnoringElementContentWhitespace(true);
    DocumentBuilder builder = factory.newDocumentBuilder();
    File file = new File("test.xml");
    Document doc = builder.parse(file);
    // Do something with the document here.
}

SAX Parser: Nur zum Lesen eines XML-Dokuments. Der Sax-Parser durchläuft das Dokument und ruft die Rückrufmethoden des Benutzers auf. Es gibt Methoden zum Starten / Beenden eines Dokuments, Elements usw. Sie sind in org.xml.sax.ContentHandler definiert und es gibt eine leere Hilfsklasse DefaultHandler.

public static void parse() throws ParserConfigurationException, SAXException {
    SAXParserFactory factory = SAXParserFactory.newInstance();
    factory.setValidating(true);
    SAXParser saxParser = factory.newSAXParser();
    File file = new File("test.xml");
    saxParser.parse(file, new ElementHandler());    // specify handler
}

StAx Reader / Writer: Dies funktioniert mit einer datenstromorientierten Schnittstelle. Das Programm fragt nach dem nächsten Element, wenn es wie ein Cursor / Iterator bereit ist. Sie können damit auch Dokumente erstellen. Dokument lesen:

public static void parse() throws XMLStreamException, IOException {
    try (FileInputStream fis = new FileInputStream("test.xml")) {
        XMLInputFactory xmlInFact = XMLInputFactory.newInstance();
        XMLStreamReader reader = xmlInFact.createXMLStreamReader(fis);
        while(reader.hasNext()) {
            reader.next(); // do something here
        }
    }
}

Dokument schreiben:

public static void parse() throws XMLStreamException, IOException {
    try (FileOutputStream fos = new FileOutputStream("test.xml")){
        XMLOutputFactory xmlOutFact = XMLOutputFactory.newInstance();
        XMLStreamWriter writer = xmlOutFact.createXMLStreamWriter(fos);
        writer.writeStartDocument();
        writer.writeStartElement("test");
        // write stuff
        writer.writeEndElement();
    }
}

JAXB: Die neueste Implementierung zum Lesen von XML-Dokumenten: Ist Teil von Java 6 in Version 2. Auf diese Weise können wir Java-Objekte aus einem Dokument serialisieren. Sie lesen das Dokument mit einer Klasse, die eine Schnittstelle zu javax.xml.bind.Unmarshaller implementiert (eine Klasse hierfür erhalten Sie von JAXBContext.newInstance). Der Kontext muss mit den verwendeten Klassen initialisiert werden, aber Sie müssen nur die Stammklassen angeben und müssen sich nicht um statisch referenzierte Klassen kümmern. Sie verwenden Anmerkungen, um anzugeben, welche Klassen Elemente (@XmlRootElement) und welche Felder Elemente (@XmlElement) oder Attribute (@XmlAttribute, was für eine Überraschung!) Sein sollen.

public static void parse() throws JAXBException, IOException {
    try (FileInputStream adrFile = new FileInputStream("test")) {
        JAXBContext ctx = JAXBContext.newInstance(RootElementClass.class);
        Unmarshaller um = ctx.createUnmarshaller();
        RootElementClass rootElement = (RootElementClass) um.unmarshal(adrFile);
    }
}

Dokument schreiben:

public static void parse(RootElementClass out) throws IOException, JAXBException {
    try (FileOutputStream adrFile = new FileOutputStream("test.xml")) {
        JAXBContext ctx = JAXBContext.newInstance(RootElementClass.class);
        Marshaller ma = ctx.createMarshaller();
        ma.marshal(out, adrFile);
    }
}

Beispiele schamlos kopiert von einigen alten Vorlesungsfolien ;-)

Bearbeiten: Über "Welche API soll ich verwenden?". Nun, es kommt darauf an - nicht alle APIs haben die gleichen Funktionen wie Sie sehen, aber wenn Sie die Kontrolle über die Klassen haben, die Sie zum Zuordnen des XML-Dokuments verwenden, ist JAXB meine persönliche Lieblingslösung, wirklich elegant und einfach (obwohl ich sie nicht verwendet habe) wirklich große Dokumente, es könnte etwas komplex werden). SAX ist auch ziemlich einfach zu bedienen und halten Sie sich einfach von DOM fern, wenn Sie keinen wirklich guten Grund haben, es zu verwenden - meiner Meinung nach alte, klobige API. Ich glaube nicht, dass es moderne Bibliotheken von Drittanbietern gibt, die etwas besonders Nützliches enthalten, das in der STL fehlt, und die Standardbibliotheken haben die üblichen Vorteile, extrem gut getestet, dokumentiert und stabil zu sein.

Voo
quelle
@ Natix, deshalb ist die Option "Bearbeiten" für. Sollte jetzt besser sein.
Kikiwa
4
@Kikiwa Die Ausnahmebehandlung ist so weit wie möglich vom Punkt dieses Beitrags entfernt. Wenn ein inkompetenter Copy-Paste-Programmierer Snippets kopiert, ohne deren Zweck zu verstehen, erhalten sie das, was sie verdienen. Nicht wirklich besorgt oder interessiert über sie. Was ich sagen werde, ist, dass das Entfernen der Try / Catch-Blöcke und das Anzeigen der Methodensignatur, um zu dokumentieren, welche Ausnahmen die verschiedenen Optionen auslösen können, Platz sparen würde, während die interessanten Informationen erhalten bleiben. Wenn jemand das tun möchte, sollte er einfach weitermachen.
Voo
1
(Gleichzeitig lehne ich Änderungen ab, die den Versuch / Fang entfernen, ohne die zusätzlichen Informationen auf andere Weise zu
kennzeichnen.
Ich glaube, JAXB ist in neueren Versionen nicht mehr im JDK enthalten.
Slaw
11

Java unterstützt zwei Methoden zum sofortigen Parsen von XML.

SAXParser

Sie können diesen Parser verwenden, wenn Sie große XML-Dateien analysieren und / oder nicht viel Speicher verwenden möchten.

http://download.oracle.com/javase/6/docs/api/javax/xml/parsers/SAXParserFactory.html

Beispiel: http://www.mkyong.com/java/how-to-read-xml-file-in-java-sax-parser/

DOMParser

Sie können diesen Parser verwenden, wenn Sie XPath-Abfragen durchführen müssen oder das vollständige DOM verfügbar sein müssen.

http://download.oracle.com/javase/6/docs/api/javax/xml/parsers/DocumentBuilderFactory.html

Beispiel: http://www.mkyong.com/java/how-to-read-xml-file-in-java-dom-parser/

RAJH
quelle
5

Wenn Sie eine DOM-ähnliche API wünschen, dh eine, bei der der XML-Parser das Dokument in einen Baum von Element- und Attributknoten verwandelt, stehen mindestens vier zur Auswahl: DOM selbst, JDOM, DOM4J und XOM. Der einzig mögliche Grund für die Verwendung von DOM besteht darin, dass es als Standard wahrgenommen und im JDK bereitgestellt wird: Im Übrigen sind alle anderen überlegen. Meine eigene Präferenz für die Kombination von Einfachheit, Leistung und Leistung ist XOM.

Natürlich gibt es auch andere Verarbeitungsstile: Parser-Schnittstellen auf niedriger Ebene (SAX und StAX), Datenobjekt-Bindungsschnittstellen (JAXB) und deklarative Sprachen auf hoher Ebene (XSLT, XQuery, XPath). Welches für Sie am besten geeignet ist, hängt von Ihren Projektanforderungen und Ihrem persönlichen Geschmack ab.

Michael Kay
quelle
2
DOM ist ein W3C-Standard ( w3.org/DOM ). Die Java-Implementierung dieses Standards wird durch den JAXP-Standard ( jcp.org/en/jsr/detail?id=206 ) abgedeckt . JAXP wird dann von verschiedenen Anbietern wie Oracle, Apache usw.
implementiert
In der Tat würde niemand DOM verwenden, wenn es nicht so wäre, dass (a) es als Standard definiert wurde und mehrere Implementierungen hat und (b) es standardmäßig im JDK enthalten ist. Aus allen anderen Perspektiven sind JDOM2 und XOM sehr vorzuziehen.
Michael Kay
4

Nikitas Argument ist ausgezeichnet: Verwechseln Sie nicht reif mit schlecht. XML hat sich nicht viel geändert.

JDOM wäre eine weitere Alternative zu DOM4J.

Duffymo
quelle
Welches wirst du wählen und warum?
Premraj
1
Es ist nicht wirklich wichtig. Beide sind Wrapper der im JDK integrierten SAX- und DOM-Parser. Die W3C-Dokumenthierarchie ist ausführlich und schwer zu verwenden, daher versuchen sowohl DOM4J als auch JDOM, dies zu vereinfachen. Ich mag Elliott Rusty Harold, deshalb greife ich eher zuerst nach JDOM.
Duffymo
4

Sie benötigen keine externe Bibliothek zum Parsen von XML in Java. Java verfügt seit Ewigkeiten über integrierte Implementierungen für SAX und DOM.

ChrisJ
quelle
3

Für Leute, die an der Verwendung von JDOM interessiert sind, aber befürchten, dass dies seit einiger Zeit nicht mehr aktualisiert wurde (insbesondere ohne Java-Generika), gibt es eine Abzweigung namens CoffeeDOM, die genau diese Aspekte berücksichtigt und die JDOM-API modernisiert. Lesen Sie hier mehr:

http://cdmckay.org/blog/2011/05/20/introducing-coffeedom-a-jdom-fork-for-java-5/

und laden Sie es von der Projektseite herunter unter:

https://github.com/cdmckay/coffeedom

ngeek
quelle
1

VTD-XML ist die leistungsstarke XML-Parsing-Bibliothek. Sie ist in nahezu jeder Hinsicht besser als andere. Hier ist ein Artikel aus dem Jahr 2013, in dem alle auf der Java-Plattform verfügbaren XML-Verarbeitungsframeworks analysiert werden.

http://sdiwc.us/digitlib/journal_paper.php?paper=00000582.pdf

vtd-xml-author
quelle
3
Eine Warnung: VTD-XML ist unter der GPL lizenziert, was es in den allermeisten beruflichen oder kommerziellen Entwicklungssituationen effektiv ausschließt. Ingenieure sollten ihren eigenen Anwalt für eine Analyse konsultieren. Wenn Sie jedoch für das Engineering bezahlt werden, werden Sie höchstwahrscheinlich feststellen, dass Ihre Organisation die Verwendung von Bibliotheken, die unter der GPL lizenziert sind, nicht zulässt (und nicht zulassen kann).
Sarah G
Dieser Link ist tot
null