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

158

Je cherche dans la bibliothèque java pour analyser XML (fichiers de configuration et de données complexes), j'ai un peu cherché sur Google mais je n'ai pas trouvé d'autre que dom4j (on dirait qu'ils travaillent sur V2) .. J'ai regardé la configuration des communs mais je n'ai pas Je n'aime pas ça, 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 d'autres (bonnes) bibliothèques d'analyse XML open source? et comment est ton expérience avec dom4j?

Après la réponse de @ Voo, permettez-moi d'en poser une autre - Dois-je utiliser les classes intégrées de java ou toute bibliothèque tierce comme dom4j .. Quels sont les avantages?

Premraj
la source
Pouvez-vous définir le bien? Performance, qualité de l'API, autre chose?
Yishai
Performance et facilité d'utilisation (oui, la qualité de l' API)
Premraj
3
Vous n'avez pas publié de raisons spécifiques pour ne pas utiliser les implémentations natives de Java.
Aéroglisseur plein d'anguilles le
vtd-xml sera celui à battre pour les performances / l'utilisation de la mémoire et la facilité d'utilisation.
vtd-xml-author

Réponses:

213

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

DOM Parser / Builder: La structure XML entière 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.sax.ContentHandler et il existe une classe d'assistance 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 flux de données. 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. 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
        }
    }
}

Rédiger 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 des documents XML: fait partie de Java 6 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 vers javax.xml.bind.Unmarshaller (vous obtenez une classe pour cela à partir de JAXBContext.newInstance). Le contexte doit être initialisé avec les classes utilisées, mais il vous suffit de spécifier les classes racines et de ne pas 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, quelle 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);
    }
}

Rédiger 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 à partir de vieilles diapositives de cours ;-)

Edit: A 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 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 (même si je ne l'ai pas utilisée pour documents très volumineux, cela pourrait devenir un peu complexe). SAX est également assez facile à utiliser et restez à l'écart de DOM si vous n'avez pas vraiment de bonne raison de l'utiliser - une API ancienne et maladroite à mon avis. Je ne pense pas qu'il existe des bibliothèques tierces modernes qui présentent 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.

Voo
la source
@Natix c'est pourquoi l'option "modifier" est pour. Ça devrait être mieux maintenant.
Kikiwa le
4
@Kikiwa La gestion des exceptions est à peu près aussi éloignée que possible du point de cet article. Si un programmeur de copier-coller incompétent continue et copie des extraits sans comprendre leur objectif, ils obtiennent ce qu'ils méritent. Pas vraiment inquiet ou intéressé à leur sujet. Ce que je dirai, c'est que supprimer les blocs try / catch et afficher la signature de la méthode à la place pour documenter les exceptions que les différentes options peuvent lancer permettrait d'économiser de l'espace tout en préservant les informations intéressantes. Donc, si quelqu'un veut faire cela, il devrait simplement y aller.
Voo le
1
(En même temps, je rejetterai les modifications qui suppriment le try / catch sans indiquer les informations supplémentaires d'une autre manière)
Voo
Je crois que JAXB n'est plus inclus avec le JDK dans les versions récentes.
Slaw
11

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

SAXParser

Vous pouvez utiliser cet analyseur si vous souhaitez analyser de gros fichiers XML et / ou si vous ne voulez 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 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/

RAJH
la source
5

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

Et bien sûr, il existe d'autres styles de traitement: des interfaces d'analyseur de bas niveau (SAX et StAX), des interfaces de liaison d'objet de données (JAXB) et des 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.

Michael Kay
la source
2
DOM est un standard du W3C ( w3.org/DOM ). L'implémentation Java de cette norme est couverte par la norme JAXP ( jcp.org/en/jsr/detail?id=206 ). JAXP est ensuite implémenté par différents fournisseurs tels que: Oracle, Apache, etc.
bdoughan
En effet, personne n'utiliserait le DOM du tout si ce n'était que (a) il a été défini comme un standard et a plusieurs implémentations, et (b) il est inclus dans le JDK par défaut. De tous les autres points de vue, JDOM2 et XOM sont de loin préférables.
Michael Kay
4

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

JDOM serait une autre alternative à DOM4J.

duffymo
la source
Lequel allez-vous choisir et pourquoi?
Premraj
1
Cela n'a pas vraiment d'importance. Les deux sont des wrappers des analyseurs SAX et DOM intégrés au JDK. La hiérarchie des documents du W3C est verbeuse et difficile à utiliser, donc DOM4J et JDOM essaient de la rendre plus facile. J'aime Elliott Rusty Harold, donc j'ai tendance à commencer par JDOM.
duffymo
4

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

ChrisJ
la source
3

Pour les personnes intéressées par l'utilisation de JDOM, mais craignant que cela n'ait pas été mis à jour depuis un certain temps (en particulier ne tirant pas 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 depuis la page du projet à l'adresse:

https://github.com/cdmckay/coffeedom

ngeek
la source
1

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

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

auteur-vtd-xml
la source
3
Un avertissement: VTD-XML il est sous licence GPL, ce qui l'exclut dans la grande majorité des situations de développement professionnel ou commercial. Les ingénieurs doivent consulter leur propre avocat pour une analyse, mais si vous êtes payé pour faire de l'ingénierie, vous constaterez probablement que votre organisation n'autorise pas (et ne peut pas) utiliser les bibliothèques sous licence GPL.
Sarah G
Ce lien est mort
null