7
votes

Xmlstreamreader et un vrai flux

update strong> Il n'y a pas d'analyseur XML prêt à la communauté Java pouvant faire une analyse NIO et XML. C'est le plus proche que j'ai trouvé, et c'est incomplet: http://wiki.fasterxml.com/aaltohome J'ai le code suivant: P>

<root>
    <child>


0 commentaires

6 Réponses :


1
votes

Le flux doit contenir le contenu d'un document XML entier, tout simplement pas en mémoire en même temps (c'est ce que font les flux). Vous pourriez être capable de garder le flux et le lecteur ouvert pour continuer à nourrir le contenu; Cependant, il faudrait faire partie d'un document XML bien formé.

Suggestion: Vous voudrez peut-être lire un peu plus sur la façon dont les sockets et les flux fonctionnent avant d'aller beaucoup plus loin.

J'espère que cela aide.


5 commentaires

Oui, le flux doit potentiellement contenir un document entier. Mais pourquoi XmlstreamReader devrait-il essayer de valider tout cela à l'avant? C'est un flux. Pourquoi ne peut-il pas simplement aller avec les données et analyser ce qui est disponible? Et si il rencontre une erreur, je l'aborderais moi-même. Corrigez-moi si je me trompe - vous dites que si je lisez 1 document XML de taille GigaByte sur un réseau, je devrais télécharger tout cela et que XMLStreamReader puisse-t-il itérair?


Je penserais que cela ne validerait pas tant que l'ensemble du flux n'a été traité (et fermé). Vous ne devriez pas avoir à télécharger le tout, c'est ce que sont les flux. Écrivez-vous au flux puis en fermez-le et essayez d'écrire plus?


Yuri, non, les analyseurs Stax ne le liront pas complètement en premier; Vous pouvez définitivement commencer à lire tout de suite et parser ne bloquera que s'il n'a pas encore de données à analyser. Je ne sais pas quelle est la question, mais votre compréhension est correcte.


@Staxman Blocking n'est pas une option, comme je l'ai expliqué dans Commentaire à @MDMA.


D'accord. Vous pourriez peut-être modifier légèrement la question pour l'indiquer exactement? BTW, en ce qui concerne AALTO, il est à nouveau actif et ASYNC API est terminé; Et l'analyseur Async (il est entièrement prêt à bloquer un; et surtout complet ASYNC Parser) est enfin terminé. J'aimerais vous voir sur la liste de diffusion pour discuter davantage, obtenir des commentaires?



-2
votes

Regardez ce lien pour comprendre davantage sur la façon dont les analyseurs de streaming fonctionnent et comment vous maintenez-t-il plus petit de la mémoire. Pour les XML entrants, vous auriez besoin d'abord de sérialiser le XML entrant et de créer un XML bien formé, puis de le donner à l'analyseur en continu.

http://www.devx.com/xml/article/34037/1954


0 commentaires

0
votes

Quelle version Java utilisez-vous? Avec JDK 1.6.0_19, je reçois le comportement que vous semblez attendre. Itération sur votre exemple Fragment XML me donne trois événements:

  • start_element (racine)
  • Personnages (espaces entre et)
  • start_element (enfant)

    La quatrième invocation de Suivant () jette une xmlstreamexception: ParseError à [rangée, col]: [2,12] Message: Les structures de document XML doivent démarrer et se terminer dans la même entité.


1 commentaires

C'est la même chose que ce que fait Woodstox aussi. Question est fausse dans l'implication contraire.



3
votes

Vous pouvez obtenir ce que vous voulez - une analyse partielle, mais vous ne devez pas fermer le flux lorsque vous atteignez la fin des données disponibles actuelles. Gardez le courant d'ouverture et l'analyseur bloquera simplement quand il arrive à la fin du flux. Lorsque vous avez plus de données, alors ajoutez-le au flux et l'analyseur continuera.

Cet arrangement nécessite deux threads - un fil exécutant l'analyseur et une autre donnée de récupération. Pour combler les deux threads, vous utilisez une pipe - une paire de tuyaux de tuyauinputtream et de tuyaut-députée qui pousse les données du filetage du lecteur dans le flux d'entrée utilisé par l'analyseur. (L'analyseur lit les données de la tuyauterie.)


1 commentaires

J'aurais dû préciser que le blocage n'est pas une option dans mon cas. Lorsqu'il n'y a plus de données disponibles pour la lecture (à l'invocation actuelle), l'analyseur devrait le traiter comme une situation normale et me fournir tout ce qui est analysé des données partielles.



1
votes

Si vous avez absolument besoin de NIO avec contenu "Push", il y a des développeurs intéressés à remplir API pour AALTO. L'analyseur lui-même est une implémentation complète des stax ainsi que la variante "appuyez sur une entrée" (entrée d'alimentation au lieu d'utiliser InputStream). Vous pouvez donc plutôt vouloir vérifier les listes de diffusion si vous êtes intéressé. Tout le monde ne lit pas les questions Stackoverflow. : -)


0 commentaires

0
votes

Avec le XMLEVentreader à l'aide de Stax Parser, cela fonctionne sans aucun problème. XXX PRE>

est évidemment votre entrée. P>

 while(xmlEventReader.hasNext()){

        XMLEvent xmlEvent = xmlEventReader.nextEvent();
        logger.debug("LOG XML EVENT "+xmlEvent.toString());
        if (xmlEvent.isStartElement()){ 
         //continue implementation


0 commentaires