Quelle est la meilleure bibliothèque pour l’parsing XML en Java

Je cherche la bibliothèque java pour parsingr XML (fichiers de configuration et de données complexes), je google un peu mais je n’ai pas pu trouver autre chose que dom4j (On dirait qu’ils travaillent sur V2) .. J’ai pris la configuration des commons mais Je n’ai pas aimé, d’autres projets Apache sur XML semblent en veille prolongée. Je n’ai pas évalué dom4j par moi-même mais je voulais juste savoir – Est-ce que java a d’autres (bonnes) librairies d’parsing XML open source? et comment est votre expérience avec dom4j?

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

En fait, Java prend en charge 4 méthodes pour parsingr 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’parsingur Sax parcourt le document et appelle les méthodes de rappel de l’utilisateur. Il existe des méthodes pour démarrer / terminer un document, 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 stream de données. Le programme demande l’élément suivant lorsqu’il est prêt, comme un curseur / un iterator. 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 } } } 

Ecrire un 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 toute dernière implémentation pour lire des documents XML: fait partie de Java 6 dans v2. Cela nous permet de sérialiser des objects 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 à partir 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 atsortingbuts (@XmlAtsortingbute, 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); } } 

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

Des exemples copiés sans scrupules de vieilles diapositives de conférences 😉

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 voyez, mais si vous contrôlez 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’utilise pas pour des documents vraiment volumineux, ça pourrait être un peu complexe). SAX est assez facile à utiliser et rest à l’écart de DOM si vous n’avez pas une très bonne raison de l’utiliser – à mon avis, une vieille API maladroite. Je ne pense pas qu’il existe des bibliothèques tierces modernes qui soient particulièrement utiles et qui ne sont pas disponibles dans la STL, et les bibliothèques standard présentent les avantages habituels d’être extrêmement bien testées, documentées et stables.

Java prend en charge deux méthodes d’parsing syntaxique XML.

SAXParser

Vous pouvez utiliser cet parsingur si vous souhaitez parsingr de gros fichiers XML et / ou ne 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 parsingur si vous avez besoin de faire des requêtes XPath ou si vous avez besoin du DOM complet.

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/

Le sharepoint Nikita est excellent: ne confondez pas mature avec le mal. XML n’a pas beaucoup changé.

JDOM serait une autre alternative à DOM4J.

Vous n’avez pas besoin d’une bibliothèque externe pour parsingr XML en Java. Java est fourni avec des implémentations intégrées pour SAX et DOM depuis longtemps.

Si vous voulez une API de type DOM, c’est-à-dire une interface XML transformant le document en une arborescence de nœuds Element et Atsortingbute, vous avez le choix entre au moins quatre: DOM lui-même, JDOM, DOM4J et XOM. La seule raison possible d’utiliser DOM est qu’il est perçu comme une norme et est fourni dans le JDK: à tous les autres égards, les autres sont tous supérieurs. Je préfère, pour sa combinaison de simplicité, de puissance et de performance, XOM.

Et bien sûr, il existe d’autres styles de traitement: interfaces d’parsing de bas niveau (SAX et StAX), interfaces de liaison d’objects 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.

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 pas tirer parti des génériques Java), il existe un fork appelé CoffeeDOM qui répond exactement à ces aspects et modernise l’API JDOM.

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 à:

https://github.com/cdmckay/coffeedom

VTD-XML est la librairie d’parsing syntaxique XML la plus exigeante … mieux que d’autres dans pratiquement tous les domaines … voici un article 2013 qui parsing tous les frameworks de traitement XML disponibles sur la plate-forme Java …

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