Qual è la migliore libreria per l'analisi XML in Java [chiuso]


158

Sto cercando nella libreria java per analizzare XML (configurazione complessa e file di dati), ho cercato su Google un po 'ma non sono riuscito a trovare altro che dom4j (sembra che stiano lavorando su V2) .. Ho dato un'occhiata alla configurazione comune ma non ho mi piace, altri progetti apache su XML sembrano in letargo. Non ho valutato dom4j da solo, ma volevo solo sapere: java ha altre (buone) librerie di analisi XML open source? e come è stata la tua esperienza con dom4j?

Dopo la risposta di @ Voo, lascia che te ne chieda un'altra: dovrei usare le classi integrate di java o qualsiasi libreria di terze parti come dom4j .. Quali sono i vantaggi?


Sai definire bene? Prestazioni, qualità dell'API, qualcos'altro?
Yishai,

Prestazioni e facilità d'uso (sì, Qualità dell'API)
Premraj

3
Non hai pubblicato alcun motivo specifico per non utilizzare le implementazioni native di Java.
Hovercraft Full Of Eels,

vtd-xml sarà quello da battere per prestazioni / utilizzo della memoria e facilità d'uso.
vtd-xml-author,

Risposte:


213

In realtà Java supporta 4 metodi per analizzare XML out of the box:

Parser / builder DOM: l'intera struttura XML viene caricata in memoria e puoi utilizzare i noti metodi DOM per lavorare con essa. DOM consente inoltre di scrivere nel documento con trasformazioni Xslt. Esempio:

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.
}

Parser SAX: solo per leggere un documento XML. Il parser Sax esegue il documento e chiama i metodi di callback dell'utente. Esistono metodi per l'inizio / la fine di un documento, un elemento e così via. Sono definiti in org.xml.sax.ContentHandler e c'è una classe di supporto vuota 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: funziona con un'interfaccia orientata al flusso di dati. Il programma richiede l'elemento successivo quando è pronto proprio come un cursore / iteratore. Puoi anche creare documenti con esso. Leggi il documento:

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
        }
    }
}

Scrivi documento:

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: la più recente implementazione per leggere documenti XML: fa parte di Java 6 in v2. Questo ci consente di serializzare oggetti Java da un documento. Leggi il documento con una classe che implementa un'interfaccia per javax.xml.bind.Unmarshaller (ottieni una classe per questo da JAXBContext.newInstance). Il contesto deve essere inizializzato con le classi utilizzate, ma devi solo specificare le classi radice e non devi preoccuparti delle classi con riferimento statico. Usa le annotazioni per specificare quali classi dovrebbero essere elementi (@XmlRootElement) e quali campi sono elementi (@XmlElement) o attributi (@XmlAttribute, che sorpresa!)

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);
    }
}

Scrivi documento:

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);
    }
}

Esempi copiati spudoratamente da alcune vecchie diapositive delle lezioni ;-)

Modifica: Informazioni su "quale API dovrei usare?". Bene dipende - non tutte le API hanno le stesse capacità che vedi, ma se hai il controllo sulle classi che usi per mappare il documento XML JAXB è la mia soluzione preferita personale, davvero elegante e semplice (anche se non l'ho usata per documenti molto grandi, potrebbe diventare un po 'complesso). SAX è anche abbastanza facile da usare e stai lontano da DOM se non hai davvero un buon motivo per usarlo - API vecchia e goffa secondo me. Non credo che ci siano librerie di terze parti moderne che presentano qualcosa di particolarmente utile che manca all'STL e le librerie standard hanno i soliti vantaggi di essere estremamente ben testate, documentate e stabili.


@Natix ecco perché l'opzione "modifica" è per. Dovrebbe essere migliore ora.
Kikiwa,

4
@Kikiwa La gestione delle eccezioni è rimossa il più possibile dal punto di questo post. Se un programmatore incompetente copia-incolla va avanti e copia frammenti senza capirne lo scopo, ottengono ciò che meritano. Non sono davvero preoccupati o interessati a loro. Quello che dirò è che rimuovere i blocchi try / catch e mostrare la firma del metodo invece di documentare quali eccezioni le diverse opzioni possono generare risparmierebbero spazio conservando comunque le informazioni interessanti. Quindi, se qualcuno vuole farlo, dovrebbe semplicemente andare avanti.
Voo,

1
(Allo stesso tempo, rifiuterò le modifiche che rimuovono il tentativo / cattura senza denotare le informazioni aggiuntive in qualche altro modo)
Voo

Credo che JAXB non sia più incluso con JDK nelle ultime versioni.
Slaw

11

Java supporta due metodi per l'analisi XML pronta all'uso.

SAXParser

È possibile utilizzare questo parser se si desidera analizzare file XML di grandi dimensioni e / o non si desidera utilizzare molta memoria.

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

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

DOMParser

È possibile utilizzare questo parser se è necessario eseguire query XPath o se è necessario disporre del DOM completo.

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

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


5

Se si desidera un'API simile a DOM, ovvero una in cui il parser XML trasforma il documento in un albero di nodi Element e Attribute, allora ce ne sono almeno quattro tra cui scegliere: DOM stesso, JDOM, DOM4J e XOM. L'unica ragione possibile per usare DOM è perché è percepito come uno standard e viene fornito nel JDK: sotto tutti gli altri aspetti, gli altri sono tutti superiori. La mia preferenza, per la sua combinazione di semplicità, potenza e prestazioni, è XOM.

E, naturalmente, esistono altri stili di elaborazione: interfacce parser di basso livello (SAX e StAX), interfacce di associazione dati-oggetto (JAXB) e linguaggi dichiarativi di alto livello (XSLT, XQuery, XPath). La scelta migliore dipende dalle esigenze del progetto e dai gusti personali.


2
DOM è uno standard W3C ( w3.org/DOM ). L'implementazione Java di questo standard è coperta dallo standard JAXP ( jcp.org/en/jsr/detail?id=206 ). JAXP viene quindi implementato da diversi provider come: Oracle, Apache, ecc.
bdoughan,

In effetti, nessuno userebbe affatto DOM se non fosse che (a) era definito come standard e ha implementazioni multiple e (b) è incluso nel JDK di default. Da tutte le altre prospettive, JDOM2 e XOM sono molto preferibili.
Michael Kay il

4

Il punto di Nikita è eccellente: non confondere il maturo con il male. XML non è cambiato molto.

JDOM sarebbe un'altra alternativa a DOM4J.


Quale sceglierai e perché?
Premraj,

1
Non ha molta importanza. Entrambi sono wrapper dei parser SAX e DOM integrati in JDK. La gerarchia del documento W3C è dettagliata e difficile da usare, quindi sia DOM4J che JDOM cercano di renderlo più semplice. Mi piace Elliott Rusty Harold, quindi tendo a cercare prima JDOM.
Duffymo,

4

Non è necessaria una libreria esterna per l'analisi di XML in Java. Java è arrivato con implementazioni integrate per SAX e DOM da secoli.



1

VTD-XML è la libreria di analisi XML heavy duty ... è migliore di altre praticamente in ogni modo ... ecco un documento del 2013 che analizza tutti i framework di elaborazione XML disponibili nella piattaforma java ...

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


3
Un avvertimento: VTD-XML è concesso in licenza in base alla GPL, che lo esclude efficacemente nella stragrande maggioranza delle situazioni di sviluppo professionale o commerciale. Gli ingegneri dovrebbero consultare il proprio avvocato per un'analisi, ma se sei pagato per fare ingegneria, molto probabilmente scoprirai che la tua organizzazione non (e non può) consentire l'uso di alcuna biblioteca autorizzata ai sensi della GPL.
Sarah G,

Quel collegamento è morto
null
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.