Quelle est la meilleure bibliothèque pour l'analyse XML en java [fermé]


Je recherche la bibliothèque java pour analyser XML (configuration complexe et fichiers de données), j'ai googlé un peu mais je n'ai pas trouvé autre que dom4j (on dirait qu'ils travaillent sur V2).. J'ai regardé la configuration de commons mais je ne l'ai pas aimé, D'autres projets apache sur XML semblent en hibernation. Je n'ai pas évalué dom4j par moi - même mais je voulais juste savoir-Java a-t-il une autre (bonne) bibliothèque d'analyse XML open source? et comment est votre expérience avec dom4j?

Après la réponse de @Voo permettez - moi d'en demander un autre-Dois-je utiliser java dans les classes construites ou dans une troisième bibliothèque comme dom4j.. Quels sont les avantages?

Author: Premraj, 2011-02-20

7 answers

En fait, Java prend en charge 4 méthodes pour analyser XML hors de la boîte:

DOM Parser/Builder: Toute la structure XML est chargée en mémoire et vous pouvez utiliser les méthodes DOM bien connues pour travailler avec elle. DOM vous permet également d'écrire dans le document avec des transformations Xslt. Exemple:

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: Uniquement pour lire un document XML. L'analyseur Sax parcourt le document et appelle les méthodes de rappel de l'utilisateur. Il existe des méthodes pour le début/la fin d'un document, d'un élément, etc. Ils sont définis dans org.XML.Saxo.ContentHandler et il y a une classe d'aide vide 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: Cela fonctionne avec une interface orientée datastream. Le programme demande l'élément suivant lorsqu'il est prêt, tout comme un curseur/itérateur. Vous pouvez également créer des documents avec elle. Lire le document:

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

Écrire le document:

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 dernière implémentation pour lire les documents XML: Fait partie de Java 6 dans la v2. Cela nous permet de sérialiser des objets java à partir de document. Vous lisez le document avec une classe qui implémente une interface javax.XML.lier.Unmarshaller (vous obtenez une classe pour cela de JAXBContext.newInstance). Le contexte doit être initialisé avec les classes utilisées, mais vous devez simplement spécifier les classes racine et ne pas avoir à vous soucier des classes référencées statiques. Vous utilisez des annotations pour spécifier quelles classes doivent être des éléments (@XmlRootElement) et quels champs sont des éléments(@XmlElement) ou des attributs (@XmlAttribute, surprise!)

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

Écrire le document:

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

Exemples copiés sans vergogne de certaines anciennes diapositives de cours; -)

Edit: À propos de " quelle API dois-je utiliser?". Eh bien, cela dépend-toutes les API n'ont pas les mêmes capacités que vous le voyez, mais si vous avez le contrôle sur les classes que vous utilisez pour mapper le document XML, JAXB est ma solution préférée, vraiment élégante et simple (bien que je ne l'ai pas utilisée pour des documents très volumineux, cela pourrait devenir un peu complexe). SAX est assez facile à utiliser aussi et restez à l'écart du DOM si vous n'avez pas une très bonne raison de l'utiliser - une ancienne API maladroite à mon avis. Je ne pense pas qu'il existe des bibliothèques tierces modernes qui comportent quelque chose de particulièrement utile qui manque à la STL et les bibliothèques standard ont les avantages habituels d'être extrêmement bien testées, documentées et stables.

 179
Author: Voo, 2018-01-25 18:12:16

Java prend en charge deux méthodes d'analyse XML prêtes à l'emploi.

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/

Dompparser

Vous pouvez utiliser cet analyseur si vous avez besoin pour faire des requêtes XPath ou besoin d'avoir le DOM complet 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/

 8
Author: RAJH, 2013-09-22 09:59:24

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

JDOM serait une autre alternative à DOM4J.

 4
Author: duffymo, 2011-02-20 19:03:57

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

 3
Author: ChrisJ, 2011-02-20 19:05:34

Si vous voulez une API de type DOM-c'est - à - dire une API où l'analyseur XML transforme le document en un arbre de nœuds d'éléments et d'attributs-il y en a au moins quatre: DOM lui-même, JDOM, DOM4J et XOM. La seule raison possible d'utiliser DOM est parce qu'il est perçu comme un standard et est fourni dans le JDK: à tous les autres égards, les autres sont tous supérieurs. Ma préférence, pour sa combinaison de simplicité, de puissance et de performance, est XOM.

Et bien sûr, il y a d'autres styles de traitement: interfaces d'analyseur de bas niveau (SAX et StAX), interfaces de liaison d'objets de données (JAXB) et langages déclaratifs de haut niveau (XSLT, XQuery, XPath). Ce qui vous convient le mieux dépend des exigences de votre projet et de vos goûts personnels.

 3
Author: Michael Kay, 2011-02-20 23:40:53

Pour les personnes intéressées à utiliser JDOM, mais craignant que cela n'ait pas été mis à jour depuis un certain temps( en particulier sans tirer parti des génériques Java), il existe un fork appelé CoffeeDOM qui aborde exactement ces aspects et modernise l'API JDOM, en savoir plus ici:

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

Et téléchargez-le à partir de la page du projet à l'adresse:

Https://github.com/cdmckay/coffeedom

 3
Author: ngeek, 2016-08-20 14:27:27

VTD-XML est la bibliothèque d'analyse XML robuste... c'est mieux que les autres dans pratiquement tous les sens... voici un article de 2013 qui analyse tous les frameworks de traitement XML disponibles dans la plate-forme java...

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

 0
Author: vtd-xml-author, 2016-04-18 06:43:07