est-il possible de donner des expressions de trajectoire dans l'analyseur sax? J'ai un fichier XML qui a quelques étiquettes de même noms, mais ils sont dans différents éléments. Y a-t-il un moyen de différencier entre eux. Voici le XML:
import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class HandleXML extends DefaultHandler { private student info; private boolean school_id = false; private boolean school_name = false; private boolean student_id = false; private boolean student_name = false; private boolean student = false; private boolean school = false; public HandleXML(student record) { super(); this.info = record; school_id = false; school_name = false; student_id = false; student_name = false; student = false; school = false; } @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { if (qName.equalsIgnoreCase("student")) { student = true; } if (qName.equalsIgnoreCase("school")) { school_id = true; } if (qName.equalsIgnoreCase("school_id")) { school_id = true; } if (qName.equalsIgnoreCase("student_id")) { student_id = true; } if (qName.equalsIgnoreCase("school_name")) { school_name = true; } if (qName.equalsIgnoreCase("student_name")) { student_name = true; } } @Override public void endElement(String uri, String localName, String qName) throws SAXException { } @Override public void characters(char ch[], int start, int length) throws SAXException { String data = new String(ch, start, length); } }
5 Réponses :
Dans un analyseur SAX, vous recevez chaque élément de la commande de document. Vous devez maintenir une pile pour suivre la nidification (pousser sur la pile lors de la manipulation de démarrage et pop pour l'endélement). Vous pouvez différencier les différents éléments Alternativement, gardez simplement une variable qui vous indique si vous avez rencontré une balise <école> code> ou
<étudiant> code> tag pour vous indiquer quel type de
+1 pour garder une pile, c'est la voie à suivre. Vous pouvez générer une chaîne de type XPath en imprimant le contenu actuel de la pile. Utiliser des drapeaux pour dire quelle étiquette que vous êtes à l'intérieur est juste laid. :-P
Oui, compréhension XML à l'aide d'un analyseur SAX est généralement un peu plus compliqué que de travailler avec DOM. Fondamentalement, vous devez maintenir l'état / le contexte dans votre analyseur Sax afin que vous puissiez différencier ces situations. P>
Remarque, l'autre clé pour la mise en œuvre d'un gestionnaire SAX consiste à comprendre que les valeurs peuvent être divisées sur plusieurs événements de caractère em>. p>
SAX est basé sur l'événement, via Callbacks, vous pouvez lire le document XML en série. SAX est bon pour la lecture de gros documents XML car l'ensemble du document n'est pas chargé en mémoire. Vous voudrez peut-être regarder XPath , par exemple
XPathFactory xPathFactory = XPathFactory.newInstance(); XPath xPath = xPathFactory.newXPath(); String expression = "/Schools/school/ ..."; XPathExpression xPathExpression = xPath.compile(expression); // Compile the expression to get a XPathExpression object. Object result = xPathExpression.evaluate(xmlDocument);
Il est possible dans saxo, aussi bien expliqué dans la réponse de Jim Garrison.
@Don Roby, correction, il est possible, mais vous le feriez vraiment de cette façon avec saxo? Je pense que l'utilisation de SAX de cette façon est trop compliquée et peut être réalisée de manière plus propre avec XPATH (aucun drapeau, pas de pile), juste mon avis
C'est plus de travail pour écrire une application SAX, mais il est parfaitement légitime si vous avez besoin de l'épargne mémoire que SAX donne et peut vous permettre les efforts de programmation supplémentaires pour y parvenir. Cependant, je pense que vous avez raison de vous inquiéter: une personne qui a besoin de poser la question posée dans ce fil va avoir beaucoup de difficulté à travailler avec SAX.
@Michael Kay Ouf quelqu'un est d'accord :) Quelqu'un d'autre m'a voté :(
Eh bien, votre déclaration liminaire est "Ce n'est pas possible avec saxo". C'est certainement possible i> si vous pensez ou non que c'est la meilleure solution.
@jtahlborn Vous avez raison, c'est pourquoi je me suis corrigé dans un commentaire à Don, voir commentaire ci-dessus, j'ai répondu à la pensée de cette partie de la question "est-il possible de donner des expressions de piste dans la SAX d'analyseur", pensant aux expressions de pathes SAX pas le printemps à l'esprit où serait comme xpath
Eh bien, je n'ai pas joué depuis des années avec saxe en Java, alors voilà ma prise: école.xml code> contient votre exemple XML. Veuillez noter que j'ai tout gramné dans un seul fichier, mais ceci est seulement pour que je jouais simplement. P> p>
private boolean isInStudentNode; ................................................... public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { // enter node Student if(qName.equalEgnoreCase("Student"){ isInStudentNode = true; } ... } public void endElement(String uri, String localName, String qName) throws SAXException { // end node Student if(qName.equalEgnoreCase("Student"){ isInStudentNode = false; ........... } // end node Name (school|student) if(qName.equalEgnoreCase("Name"){ if(isInStudentNode) student.setName(...); else school.setName(...); } } its work with me
Découvrez également: Stackoverflow.com/questions/1863250 - Il y a des projets qui vous permettent d'utiliser un sous-ensemble de XPath avec un Document de streaming. Si vous pouvez adapter votre problème dans ce sous-ensemble, le code résultant serait très préférable à tout code de gestionnaire de saxo-laminé à la main.
SAX analysant le contexte est comme une machine à états: en.wikipedia.org/wiki/finite-state_machine < / a>, vous devez avoir des indicateurs que vous pouvez activer / éteindre pour savoir où vous êtes, mais cela peut rapidement devenir très désordonné et vous devriez envisager des alternatives avant d'aller trop loin.