web-dev-qa-db-fra.com

Meilleur analyseur XML pour Java

Je dois lire des fichiers XML de petite taille (quelques Mo au plus, codés en UTF-8), fouiller dans divers éléments et attributs, peut-être en modifier quelques-uns et réécrire le code XML sur disque (de préférence avec Nice, le formatage en retrait). .

Quel serait le meilleur analyseur XML pour mes besoins? Il y a beaucoup de choix. Certains dont je suis conscient sont:

Et bien sûr celui du JDK (j'utilise Java 6). Je connais Xerces mais je le trouve maladroit.

Des recommandations?

382
Evan

Si la vitesse et la mémoire ne posent aucun problème, dom4j est une très bonne option. Si vous avez besoin de rapidité, utilisez un analyseur StAX tel que Woodstox, mais vous devez écrire plus de code pour faire avancer les choses et vous habituer à traiter le XML en flux.

80
zehrer

Je pense que vous ne devriez pas envisager d’implémentation d’analyseur spécifique. API Java pour le traitement XML vous permet d'utiliser n'importe quelle implémentation d'analyseur conforme de manière standard. Le code devrait être beaucoup plus portable, et quand vous réaliserez qu'un analyseur spécifique est devenu trop vieux, vous pouvez le remplacer par un autre sans changer une ligne de votre code (si vous le faites correctement).

Il existe fondamentalement trois manières de gérer XML de manière standard:

  • SAX C'est l'API la plus simple. Vous lisez le XML en définissant une classe Handler qui reçoit les données dans des éléments/attributs lorsque le XML est traité en série. Il est plus rapide et plus simple de ne lire que certains attributs/éléments et/ou d’écrire certaines valeurs (votre cas).
  • DOM Cette méthode crée une arborescence d'objets qui vous permet de la modifier/d'y accéder de manière aléatoire, ce qui est préférable pour les manipulations et manipulations XML complexes.
  • StAX C'est au milieu du chemin entre SAX et DOM. Vous venez d’écrire du code pour extraire les données de l’analyseur qui vous intéresse lorsqu’il est traité.

Oubliez les API propriétaires telles que celles JDOM ou Apache (c'est-à-dire Apache Xerces XMLSerializer ), car elles vous lieront à une implémentation spécifique qui peut évoluer dans le temps ou perdre la compatibilité avec les versions antérieures, ce qui vous obligera à modifier votre code dans les versions antérieures. lorsque vous souhaitez effectuer une mise à niveau vers une nouvelle version de JDOM ou l’analyseur que vous utilisez. Si vous vous en tenez à Java API standard (à l'aide d'usines et d'interfaces), votre code sera beaucoup plus modulaire et facile à gérer.

Inutile de dire que tous les analyseurs proposés (je ne les ai pas tous vérifiés, mais j'en suis presque sûr) sont conformes à la mise en oeuvre de JAXP, de sorte que techniquement, vous pouvez tous les utiliser, peu importe lequel.

252
Fernando Miguélez

Voici une comparaison intéressante entre DOM, SAX, StAX et TrAX (Source: http://download.Oracle.com/docs/cd/E17802_01/webservices/webservices/docs/1.6/tutorial/doc/SJSXP2. html )

Caractéristique StAX SAX DOM TrAX

Type d'API Pull, streaming Push, streaming Dans l'arborescence mémoire Règle XSLT

Facilité d'utilisation Elevé Moyen Elevé Moyen

Capacité XPath Non Non Oui Oui

CPU & Mémoire Bon Bon Varie Varie

Transmettre uniquement Oui Oui Non Non

Lire XML Oui Oui Oui Oui

Écrire en XML Oui Non Oui Oui

CRUD Non Non Oui Non

129
Kadir

Simple XML http://simple.sourceforge.net/ est très facile à utiliser pour (dé) sérialiser des objets.

8
asdf

Outre SAX et DOM, l'analyse STaX est disponible à l'aide de XMLStreamReader, un analyseur syntaxique d'extraction XML.

4
kitsuneymg

J'ai trouvé dom4j comme étant l'outil pour travailler avec XML. Surtout comparé à Xerces.

3
Brian Matthews

Je ne recommanderais pas cela car vous avez beaucoup de "réflexions" dans votre application, mais utiliser XSLT pourrait être mieux (et potentiellement plus rapide avec la compilation XSLT vers bytecode) que la manipulation Java.

2
Thomas Barker

Si les performances vous intéressent moins, je suis un grand fan d’Apache Digester, car il vous permet essentiellement de mapper directement du XML vers Beans Java.

Sinon, vous devez d'abord analyser, puis construire vos objets.

1
Uri