174 votes

Quelle est la meilleure bibliothèque pour l'analyse XML en Java

Je suis à la recherche de la bibliothèque java pour le traitement XML (complexe de configuration et les fichiers de données), j'ai googlé un peu, mais n'a pas trouvé d'autres que dom4j (Semble comme ils travaillent sur la V2).. j'ai pris regarder communes de configuration, mais n'a pas aimé, d'Autres projets apache sur XML semble en vertu de l'hibernation. Je n'ai pas évalué dom4j par moi-même mais je voulais juste savoir - Faire de java a d'autres (Bonnes) open source d'analyse xml bibliothèque? et quelle est votre expérience avec dom4j?

Après le @Voo de réponse, laissez-moi vous poser une autre - dois-je utiliser java dans la construction de classes ou de tout tiers bibliothèque comme dom4j.. Quels sont les avantages?

231voto

Voo Points 11981

En fait Java prend en charge 4 méthodes d'analyse XML:

DOM Parser/Générateur: l'ensemble de La structure XML est chargé en mémoire et vous pouvez utiliser le bien connu les méthodes du DOM de travailler avec elle. DOM vous permet également de rédiger le document avec des transformations Xslt. Exemple:

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

Analyseur SAX: Uniquement pour lire un document XML. L'analyseur Sax traverse le document et les appels de méthodes de rappel de l'utilisateur. Il existe des méthodes pour le début/la fin d'un document, élément et ainsi de suite. Elles sont définies dans org.xml.sax.Gestionnaire de contenu et il y a un vide de la classe helper DefaultHandler.

    SAXParserFactory factory = SAXParserFactory.newInstance();
    factory.setValidating(true);
    try {
        SAXParser saxParser = factory.newSAXParser();
        File file = new File("test.xml");
        saxParser.parse(file, new ElementHandler());    // specify handler
    }
    catch(ParserConfigurationException e1) {
    }
    catch(SAXException e1) {
    }
    catch(IOException e) {
    }

StAx Lecteur/graveur: Cela fonctionne avec un datastream interface. Le programme demande à l'élément suivant quand il est prêt, tout comme un curseur/itérateur. Vous pouvez également créer des documents avec elle. Lire le document:

    FileInputStream fis = null;
    try {
        fis = new FileInputStream("test.xml");
        XMLInputFactory xmlInFact = XMLInputFactory.newInstance();
        XMLStreamReader reader = xmlInFact.createXMLStreamReader(fis);
        while(reader.hasNext()) {
            reader.next(); // do something here
        }
    }
    catch(IOException exc) {
    }
    catch(XMLStreamException exc) {
    }

Document d'écriture:

    FileOutputStream fos = null;
    try {
        fos = new FileOutputStream("test.xml");
        XMLOutputFactory xmlOutFact = XMLOutputFactory.newInstance();
        XMLStreamWriter writer = xmlOutFact.createXMLStreamWriter(fos);
        writer.writeStartDocument();
        writer.writeStartElement("test");
        // write stuff
        writer.writeEndElement();
        writer.flush();
    }
    catch(IOException exc) {
    }
    catch(XMLStreamException exc) {
    }
    finally {
    }

JAXB: Le plus récent de la mise en œuvre de lire des documents XML: fait partie de la version 6 de Java dans la v2. Cela nous permet de sérialiser des objets java à partir d'un document. Vous lisez le document avec une classe qui implémente une interface javax.xml.bind.Unmarshaller (vous obtenez une classe de JAXBContext.newInstance). Le contexte doit être initialisé avec les classes utilisées, mais il vous suffit de spécifier la racine des classes et ne pas avoir à vous soucier de statique référencé classes. Vous utilisez les annotations de spécifier les classes devraient être les éléments (@XmlRootElement) et les champs qui sont les éléments(@XmlElement) ou des attributs (@XmlAttribute, quelle surprise!)

    RootElementClass adr = new RootElementClass();
    FileInputStream adrFile = null;
    try {
        adrFile = new FileInputStream("test");
        JAXBContext ctx = JAXBContext.newInstance(RootElementClass.class);
        Unmarshaller um = ctx.createUnmarshaller();
        adr = (RootElementClass) um.unmarshal(adrFile);
    }
    catch(IOException exc) {
    }
    catch(JAXBException exc) {
    }
    finally {
    }

Document d'écriture:

    FileOutputStream adrFile = null;
    try {
        adrFile = new FileOutputStream("test.xml");
        JAXBContext ctx = JAXBContext.newInstance(RootElementClass.class);
        Marshaller ma = ctx.createMarshaller();
        ma.marshal(..);
    }
    catch(IOException exc) {
    }
    catch(JAXBException exc) {
    }
    finally {
    }

Exemples copié sans vergogne de certains vieux conférence de diapositives ;-)

Edit: à Propos de "qui de l'API shoild-je utiliser?". Eh bien cela dépend - pas toutes les Api ont les mêmes capacités que vous voyez, mais si vous avez le contrôle sur les classes que vous utilisez à la carte le document XML JAXB est mon favori personnel, très élégant et simple de la solution (même si je ne l'ai pas utilisé pour les très gros documents, il pourrait obtenir un peu complexe). SAX est assez facile à utiliser et juste rester à l'écart de DOM si vous n'avez pas vraiment de bonne raison de l'utiliser - vieux, maladroit, API, à mon avis. Je ne pense pas que les modernes 3ème partie les bibliothèques qui disposent de quelque chose de particulièrement utile qui manque de la stl et les bibliothèques standard ont l'habitude des avantages d'être extrêmement bien testé, documenté et stable.

12voto

RAJH Points 56

Java prend en charge deux méthodes d'analyse XML hors de la boîte.

SAXParser

Vous pouvez utiliser cet analyseur si vous voulez analyser des fichiers XML et/ou ne souhaitez pas utiliser beaucoup de mémoire.

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

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

DOMParser

Vous pouvez utiliser cet analyseur si vous avez besoin de faire des requêtes XPath ou besoin d'avoir le DOM est disponible.

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

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

9voto

Nikita Rybak Points 36641

Je veux noter une chose: vieux ne veut pas dire mauvais.
2005 n'est pas une période jurassique et je pense que vous ne devriez pas rejeter une bibliothèque (au moins en Java) car elle n'a pas été mise à jour depuis 5 ans.

En fait, la dernière mise à jour majeure de Java a eu lieu à peu près au même moment. Et quand le standard XML a-t-il été finalisé? Je parie qu'il y a plus de 10 ans.

4voto

duffymo Points 188155

Le propos de Nikita est excellent: ne confondez pas mature avec mauvais. XML n'a pas beaucoup changé.

JDOM serait une autre alternative à DOM4J.

4voto

ChrisJ Points 3531

Vous n'avez pas besoin d'une bibliothèque externe pour analyser XML en Java. Java est venu avec des implémentations intégrées pour SAX et DOM depuis des siècles.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X