java utiliser StAX pour obtenir les enfants des éléments dans un générique de la mode
Je suis en train d'utiliser StAX (déjà que je n'aime pas....)
Il semble que la seule façon de l'utiliser est en continu les conditions if-else.
Mais le plus important, il semble y avoir aucun moyen d'associer un élément à ses enfants, à moins que l'un sait à l'avance le
la structure du document xml pour être analysée.Est-ce correct?
J'ai essayé ce qui suit:
J'ai ce code xml dans une Chaîne
<ns1:Root xmlns:ns1=\"http://rootNameSpace.com/\">
<ns1:A/>
<ns1:B>
<Book xmlns=\"http://www.myNameSpace.com\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">
<Data>
<Author>John</Author>
<Edition>1</Edition>
<PubHouse>Small Publishing House</PubHouse>
<Price>37.8</Price>
</Data>
</Book>
</ns1:B>
</ns1:Root>
Je voudrais utiliser StAX pour obtenir l'élément de Livre, mais il semble que je ne peux écrire du code qui a codé en dur toute la structure.
I. e. Utilisation XMLEventReader et une fois
vous obtenez Livre, de début de boucle pour les Données,Auteur etc.
Est-il un générique solution?
J'ai essayé ce qui suit pour obtenir autour de cette: j'ai essayé d'aller de Chaîne à XMLEventReader et retour à la Chaîne, mais je ne peux pas obtenir l'exacte représentation de Chaîne que j'ai utilisé (les espaces de noms sont entre parenthèses, en sus des deux-points, etc).
StringBuilder xml = new StringBuilder();
XMLInputFactory inputFactory = XMLInputFactory.newInstance();
String msg = "<ns1:Root xmlns:ns1=\"http://rootNameSpace.com/\"><ns1:A/><ns1:B><Book xmlns=\"http://www.myNameSpace.com\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"><Data><Author>John</Author><Edition>1</Edition><PubHouse>Small Publishing House</PubHouse><Price>37.8</Price></Data></Book></ns1:B></ns1:Root>";
InputStream input = new ByteArrayInputStream(msg.getBytes("UTF-8"));
XMLEventReader xmlEventReader = inputFactory.createXMLEventReader(input);
while (xmlEventReader.hasNext())
{
XMLEvent event = xmlEventReader.nextEvent();
StringWriter sw = new StringWriter();
event.writeAsEncodedUnicode(sw);
xml.append(sw);
}
System.out.println(xml);
Je reçois le texte suivant:
<?xml version="1.0" encoding='UTF-8' standalone='no'?><['http://rootNameSpace.com/']:ns1:Root xmlns:ns1='http://rootNameSpace.com/'><['http://rootNameSpace.com/']:ns1:A></ns1:A><['http://rootNameSpace.com/']:ns1:B><['http://www.myNameSpace.com']::Book xmlns:='http://www.myNameSpace.com' xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'><['http://www.myNameSpace.com']::Data><['http://www.myNameSpace.com']::Author>John</Author><['http://www.myNameSpace.com']::Edition>1</Edition><['http://www.myNameSpace.com']::PubHouse>Small Publishing House</PubHouse><['http://www.myNameSpace.com']::Price>37.8</Price></Data></Book></ns1:B></ns1:Root>
Peut en ce cas être abordé par le biais StAX ou DOM est la seule solution?
OriginalL'auteur Cratylus | 2010-11-24
Vous devez vous connecter pour publier un commentaire.
Je ne comprends pas vraiment ce que vous essayez de faire, mais si vous voulez le nom local de la balise provoquant une
START_ELEMENT
événement, vous pouvez le faire comme ceci:De même,
asEndElement
,asCharacters
, etc fournir l'accès à d'autres types de nœuds.Personnellement, j'ai l'habitude de trouver que le
XMLStreamReader
est plus pour moi dans la plupart des situations, mais je suppose que cela dépend du cas d'utilisation, ainsi que vos propres préférences personnelles. Un conseil pro, c'est que la plus stricte, le schéma, plus les données sont à analyser avec StAX.Vous pouvez également regarder JAX-B automatique de la liaison de données XML.
Edit: Voici une naïve descente récursive StAX parser du XML dans l'OP:
Écrit des trucs comme ce n'est pas que le code est beaucoup plus facile à lire et à raison, mais aussi les traces de pile lorsque des erreurs de pop up.
Eh bien, pour obtenir tous les événements de "l'intérieur" d'un élément, vous venez de lire les événements jusqu'à ce que vous avez trouvé un plus
END_ELEMENT
queSTART_ELEMENT
événements. Mais c'est une horrible DOMish manière de faire, ce que vous voulez vraiment, c'est un appel récursif à la descente de l'analyseur qui permet de lire les éléments et les traduit pour certains, objet de domaine à la volée. Désolé pour l'explication de merde, mais d'apprendre à utiliser StAX efficacement est vraiment la plupart du temps une question de coups de pied de votre DOM dépendance.imaginé so.By en disant "descente récursive de l'analyseur" vous voulez dire de ne pas utiliser StAX pour cela? Donc StAX ne pas vous offrir ce sans l'aide de "hacks"?
Post édité avec l'analyseur exemple.
merci beaucoup pour votre réponse!Mon gros souci, c'est que ce code est spécifique au document xml exemple que j'ai posté.Je veux dire, on doit connaître à l'avance la structure d'un document xml pour être analysée.Peut ce code soit modifié de façon à être générique à tout document xml (c'est à dire sans connaître la structure à l'avance)?
OriginalL'auteur gustafc
On dirait que vous avez choisi le mauvais outil ici: Stax est un grand API à utiliser pour une gestion efficace du contenu de grande taille. Mais si l'aspect pratique est plus importante que l'efficacité, oui, vous devriez probablement envisager un modèle d'arbre (pas DOM nécessairement, XOM est mieux par exemple) ou une liaison de données (JAXB ou XStream). Plus précisément, Stax comme SAX sont à base de flux de sorte que vous ne voyez quel que soit l'événement en cours ou un jeton. Il n'y a pas accesseurs pour les enfants ou les parents, car il n'y a aucune garantie d'obtenir à eux, ce qui n'est pas nécessairement possible, compte tenu de courant flux de position.
Mais si les performances ou l'utilisation de la mémoire sont un problème, vous pouvez toujours envisager de JAXB (qui est généralement plus efficace que les modèles d'arbre comme DOM), ou StaxMate. StaxMate est de haute performance, faible utilisation de la mémoire d'extension de plus de Stax, et est un peu plus pratique à utiliser.
Même si vous devez toujours effectuer une itération sur les éléments dans l'ordre du document, son curseur à l'approche de cartes de plus naturellement avec les parents puis les enfants, les recherches. Donc, il pourrait travailler pour votre cas.
OriginalL'auteur StaxMan