7
votes

Quel analyseur XML utiliser ici?

Je réveille un fichier XML comme entrée, dont la taille peut varier de quelques kbs à beaucoup plus. Je reçois ce fichier sur un réseau. J'ai besoin d'extraire un petit nombre de nœuds selon mes utilisation, la majeure partie du document est donc assez inutile pour moi. Je n'ai pas de préférences de mémoire, j'ai juste besoin d'une vitesse.

Compte tenu de tout cela, j'ai conclu:

  1. n'utilise pas DOM ici (en raison d'une éventuelle taille énorme de DOC, aucune condition de CRUD, et la source d'être réseau)

  2. pas de SAX comme il suffit d'obtenir un petit sous-ensemble de données.

  3. Stax peut être un moyen d'aller, mais je ne suis pas sûr que si c'est le moyen le plus rapide.

  4. Jaxb est venu en une autre option - mais quel type d'analyseur utilise-t-il? J'ai lu qu'il utilise des xerces par défaut (qui est quel type - push ou tirer?), Bien que je puisse le configurer pour une utilisation avec Stax ou Woodstock selon cette Link

    Je lis beaucoup, toujours confondu avec tant d'options! Toute aide serait appréciée.

    Merci!

    Edit: Je veux ajouter une autre question ici: Qu'est-ce qui ne va pas à utiliser Jaxb ici?


2 commentaires

Écrivez votre propre analyse ..?


Je ne sais pas combien de temps cela pourrait prendre! De plus, il semble plus que de réinventer la roue ...


5 Réponses :


0
votes

Je pense que vous devez utiliser saxo ou analyseur basé sur la SAX. Je vous recommanderais que Apache digestter. SAX est entraîné par l'événement et ne stocke pas l'état. C'est ce dont vous avez besoin ici, vous devez extraire une petite partie du document (je suppose une balise).


0 commentaires

6
votes

La solution la plus rapide est de loin un analyseur Stax, spécialement autant que vous n'avez besoin que d'un sous-ensemble spécifique du fichier XML et vous pouvez facilement ignorer tout ce qui n'est pas vraiment nécessaire à l'aide de Stax, pendant que vous receviez l'événement de toute façon si vous utilisiez un SAX Parser.

Mais c'est aussi un peu plus compliqué que d'utiliser saxo ou dom. Un de ces jours où j'ai dû écrire un analyseur Stax pour le XML suivant: xxx

Voici comment le code analyseur final ressemble à: xxx

Le code lui-même est en portugais, mais il devrait être simple pour vous de comprendre ce qu'il est, voici le repo sur github < / a>.


9 commentaires

stringscapepeutils.unescapExML - maintenant qu'est-ce que cela fait?


Pour une raison quelconque, ma mise en œuvre de l'analyseur n'était pas correctement insatisfaite des entités XML correctement, donc j'ai dû hack cette solution, si vous n'avez pas le même problème, ignorez simplement cette ligne et d'alimenter un fichierInputStream au XMlinPutFactory. CreeXMLStreamreader Appel.


Je pense pour la même chose, mais je vois une utilisation beaucoup plus de Jaxb ... pourquoi je ne devrais-je pas utiliser Jaxb ici?


JAXB est généralement utile lorsque vous allez utiliser le fichier XML complet et vous souhaitez tous les avoir tous comme des objets, car cela ne ressemble pas à votre cas, construire votre propre analyseur Stax optimisé semble une meilleure approche.


@ Maurício Linhares - Jaxb est très pertinent pour les cas d'utilisation où une seule partie du document est requise. Il peut également modifier un xmlstreamreader à la collecte de données nécessaire.


@Blaise DUMUM: WOW! Je suppose que je devrais aller avec Jaxb alors. Mais je suis incapable de comprendre quel type d'analyse utilise Jaxb? DOM, SAX ou STAX - ou choisit de manière appropriée le meilleur? Utilisation de Jaxbwith Stax / Woodstock ne semble pas une bonne idée selon ce lien: Java.DZone.com/articles/...


@Zombie - Lorsqu'il est immobile d'un INPURSTREAM / Lecteur, un JAXB Impl (Metro, Moxy, Jaxme, etc.) peut choisir la technologie d'analyse. Lorsqu'il est immobile d'un stax xmlstreamreader, il utilise la Stax XmlstreamReader que vous avez transmise à Unmarshal à partir de: Stackoverflow.com/Questtions/7057977/...


Genre de bizarre de voir la consommation de mémoire négative dans une référence.


Merci une tonne pour toutes vos réponses !!



5
votes

Si vous n'ayez extraire une petite quantité que, envisagez d'envisager d'utiliser XPath car cela est quelque peu plus simple que d'essayer d'extraire tout le document.


0 commentaires

1
votes

SAX ou STAX pourrait gérer cela avec un travail complexe sur laquelle vous êtes à quelque chose que vous voulez, mais pour extraire un petit ensemble de choses par chemin explicite, vous pourriez être le meilleur off avec XPath .

Une autre tactique potentielle est d'abord filtrer uniquement aux pièces que vous souhaitez utiliser XSLT puis analyser avec tout ce que vous aimez, le résultat du filtre sera un document beaucoup plus petit.


0 commentaires

3
votes

Note: Je suis le Eclipselink Jaxb (Moxy ) plomb et un membre de la JAXB 2 ( JSR- 222 ) Groupe d'experts.

Stax ( JSR-173) est généralement le moyen le plus rapide d'analyser XML et Woodstox est connu pour être un analyseur Stax rapide. En plus de l'analyse, vous devez collecter les données XML. C'est là que une combinaison de stax et de jaxb est utile.

S'assurer que notre implémentation de JAXB utilise la mise en œuvre de Stax Woodstox. Configurez votre environnement pour utiliser WoodStox (c'est aussi simple que d'ajouter Woodstox à votre parcours de classe). Créez une instance de xmlstreamreader et transmettez-la comme source que Jaxb doit être mixte.


0 commentaires