Meilleur analyseur XML pour Java [fermé]

387

J'ai besoin de lire des fichiers XML de petite taille (quelques Mo au maximum, encodés en UTF-8), fouiller autour de divers éléments et attributs, peut-être en modifier quelques-uns et réécrire le XML sur le disque (de préférence avec un formatage agréable et en retrait) .

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

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

Des recommandations?

Evan
la source
6
Je pense que vous pouvez trouver plus de joueurs ici: xml.com/lpt/a/1703
dma_k
1
je pense qu'il y a de vrais problèmes avec cette question. 1 est qu'il compare des choses totalement différentes, regroupant des analyseurs (xerces, crimson) avec des bibliothèques de manipulation de dom (dom4j, xom, jdom). les réponses tendent également vers le plaidoyer et ne sont pas si constructives.
Nathan Hughes
51
+220 et pas constructif. Les modérateurs et les utilisateurs ont clairement des perspectives différentes sur ce qui est constructif.
tbroberg
5
Oui, il semble que les mods soient myopes quand il s'agit de questions comme celle-ci. Oui, les réponses seraient subjectives mais certainement basées sur l'expérience et la plupart du temps les réponses sont quantifiées. Les mods doivent créer probablement une balise différente pour déplacer ces questions qui sont ouvertes à la discussion, ce qui entraîne des critiques constructives et des résultats.
Ashraff Ali Wahab
@dma_k votre lien ne fonctionne pas.
gaurav

Réponses:

81

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, utiliser un analyseur StAX comme Woodstox est la bonne façon, mais vous devez écrire plus de code pour faire avancer les choses et vous devez vous habituer à traiter XML dans les flux.

Zehrer
la source
6
dom4j est assez bon, mais certainement pas sans problèmes. Pour de bonnes alternatives dom4j, voir stackoverflow.com/questions/831865/…
Jonik
@zehrer sont-ils thread-safe?
gaurav
257

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

Fondamentalement, il existe trois façons de gérer XML de manière standard:

  • SAX Il s'agit de l'API la plus simple. Vous lisez le XML en définissant une classe de gestionnaire qui reçoit les données à l'intérieur des éléments / attributs lorsque le XML est traité en série. C'est plus rapide et plus simple si vous prévoyez seulement de lire certains attributs / éléments et / ou de réé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 façon aléatoire, ce qui est préférable pour la manipulation et la manipulation 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 lors de leur traitement.

Oubliez les API propriétaires telles que 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é ascendante, ce qui vous fera changer votre code à l'avenir lorsque vous voudrez mettre à niveau vers une nouvelle version de JDOM ou tout autre analyseur que vous utilisez. Si vous vous en tenez à l'API standard Java (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 (je n'ai pas tout vérifié, mais je suis presque sûr) des analyseurs proposés sont conformes à une implémentation JAXP donc techniquement vous pouvez tout utiliser, peu importe lequel.

Fernando Miguélez
la source
11
En fait, 3 façons: StAX (javax.xml.stream) est le troisième standard.
StaxMan
1
java-samples.com/showtutorial.php?tutorialid=152 (personnellement aime SAX)
kitokid
@kitokid Chrome me dit que cette page contient des choses désagréables. J'ai utilisé ceci à la place: sce.uhcl.edu/yue/courses/xml/notes/xmlparser/IntroDOM.asp
Ryan Shillington
Bon aperçu: une seule chose avec laquelle je ne serais pas d'accord - alors que pour l'incrémentiel / streaming, SAX et Stax sont bons, l'API standard suffisante, pour DOM ce n'est pas le cas (IMO): il y a des raisons valables pour des prises spécifiques à Java comme XOM, JDOM et DOM4J: le DOM indépendant du langage est assez lourd à utiliser.
StaxMan
130

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 )

Fonction StAX SAX DOM TrAX

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

Facilité d'utilisation           Élevé Moyen Élevé Moyen

Capacité XPath    Non Non Oui Oui

CPU et mémoire     Bon Bon Varie Varie

Transférer uniquement        Oui Oui Non Non

Lire XML              Oui Oui Oui Oui

Écrire XML              Oui Non Oui Oui

CRUD                      Non Non Oui Non

Kadir
la source
7
Vous pouvez écrire du XML avec SAX. Le récepteur fournit une implémentation de gestionnaire sur laquelle l'utilisateur peut appeler des événements SAX pour générer une sortie XML. (Je vois que la table provient de matériel d'origine et non, la table est fausse cependant)
Dev
4

En plus de SAX et DOM, il existe une analyse STaX disponible à l'aide de XMLStreamReader qui est un analyseur d'extraction xml.


la source
3

J'ai trouvé que dom4j était l'outil pour travailler avec XML. Surtout par rapport à Xerces.

Brian Matthews
la source
2

Je ne recommanderais pas cela, car vous avez beaucoup de "réflexion" dans votre application, mais l'utilisation de XSLT pourrait être meilleure (et potentiellement plus rapide avec la compilation XSLT en bytecode) que la manipulation Java.


la source
3
Mieux, possible: plus rapide, très peu probable.
StaxMan
Lire, manipuler et écrire du XML est exactement ce que XSLT est conçu pour faire. C'est une belle réponse prête à l'emploi.
james.garriss
1

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 analyser, puis construire vos objets.

Uri
la source
Je n'ai pas besoin de créer des Java Beans, il suffit de manipuler un peu les éléments XML bruts et d'examiner certains éléments pour en obtenir des données, donc un analyseur de style DOM est probablement ma solution idéale.
Evan
Oui, dom4j serait probablement une meilleure solution là-bas ... Je l'utilisais beaucoup, jusqu'à ce que je passe d'un niveau au digesteur
Uri