Meilleur parsingur XML pour Java

J’ai besoin de lire des fichiers XML de petite taille (quelques Mo au maximum, encodés en UTF-8), de chercher divers éléments et atsortingbuts, peut-être en modifier quelques-uns et réécrire le code XML sur le disque (de préférence avec un formatage indenté) .

Quel serait le meilleur parsingur XML pour mes besoins? Il y a beaucoup à choisir. Certains je suis au courant de sont:

  • JDOM
  • Woodstox
  • XOM
  • dom4j
  • VTD-XML
  • Xerces-J
  • cramoisi

Et bien sûr celui du JDK (j’utilise Java 6). Je suis familier avec Xerces mais je le trouve maladroit.

Recommandations?

Si la vitesse et la mémoire ne posent aucun problème, dom4j est une très bonne option. Si vous avez besoin de vitesse, utilisez un parsingur StAX comme Woodstox , mais vous devez écrire plus de code pour faire avancer les choses et vous devez vous habituer au traitement du XML dans les stream.

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

Fondamentalement, il existe trois manières de gérer le XML de manière standard:

  • SAX C’est l’API la plus simple. Vous lisez le code XML en définissant une classe de gestionnaire qui reçoit les données contenues dans les éléments / atsortingbuts lorsque le fichier XML est traité en série. Il est plus rapide et plus simple de ne lire que certains atsortingbuts / éléments et / ou d’écrire certaines valeurs (votre cas).
  • DOM Cette méthode crée un arbre d’object qui vous permet de modifier / accéder de manière aléatoire afin de mieux gérer et manipuler le XML.
  • StAX Ceci est au milieu du chemin entre SAX et DOM. Vous écrivez simplement du code pour extraire les données de l’parsingur qui vous intéresse lorsqu’il est traité.

Oubliez les API propriétaires telles que JDOM ou Apache (par exemple, Apache Xerces XMLSerializer ) car vous serez lié à une implémentation spécifique qui peut évoluer dans le temps ou perdre la rétrocompatibilité, ce qui vous obligera à modifier votre code lorsque une nouvelle version de JDOM ou tout autre parsingur que vous utilisez. Si vous vous en tenez à l’API Java standard (en utilisant des usines et des interfaces), votre code sera beaucoup plus modulaire et maintenable.

Il n’est pas nécessaire de dire que tous les parsingurs proposés (je n’ai pas tout vérifié, mais j’en suis presque sûr) sont conformes à une implémentation JAXP. Techniquement, vous pouvez tous les utiliser, peu importe lequel.

Voici une belle comparaison sur 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 de mémoire Règle XSLT

Facilité d’utilisation élevée moyenne élevée moyenne

Capacité XPath Non Non Oui Oui

CPU et mémoire Good Good Varies Varie

Transférer seulement Oui Oui Non Non

Lire XML Oui Oui Oui Oui

Écrire XML Oui Non Oui Oui

CRUD Non Non Oui Non

XML simple http://simple.sourceforge.net/ est très simple pour (dé) sérialiser des objects.

En plus de SAX et DOM, l’parsing syntaxique STaX est disponible à l’aide de XMLStreamReader, qui est un parsingur d’extraction XML.

J’ai trouvé que dom4j était l’outil de travail avec XML. Surtout par rapport à Xerces.

Je ne vous recommande pas que vous ayez beaucoup de “reflection” dans votre application, mais l’utilisation de XSLT pourrait être meilleure (et potentiellement plus rapide avec la compilation de XSLT à bytecode) que la manipulation de Java.

Si vous vous souciez moins des performances, je suis un grand fan d’Apache Digester, car il vous permet essentiellement de mapper directement de XML à Java Beans.

Sinon, vous devez d’abord parsingr, puis construire vos objects.