à l'aide de parser SAX, comment parser un fichier xml qui a le même nom de balises, mais dans les différents éléments?
Est-il possible de donner des expressions de chemin dans l'analyseur SAX? J'ai un fichier XML qui a un peu le même nom de balise, mais ils sont dans différents élément. Est-il possible de les différencier entre eux.
Voici le XML:
<Schools>
<School>
<ID>335823</ID>
<Name>Fairfax High School</Name>
<Student>
<ID>4195653</ID>
<Name>Will Turner</Name>
</Student>
<Student>
<ID>4195654</ID>
<Name>Bruce Paltrow</Name>
</Student>
<Student>
<ID>4195655</ID>
<Name>Santosh Gowswami</Name>
</Student>
</School>
<School>
<ID>335824</ID>
<Name>FallsChurch High School</Name>
<Student>
<ID>4153</ID>
<Name>John Singer</Name>
</Student>
<Student>
<ID>4154</ID>
<Name>Shane Warne</Name>
</Student>
<Student>
<ID>4155</ID>
<Name>Eddie Diaz</Name>
</Student>
</School>
</Schools>
J'ai besoin de faire la différence entre le Nom et l'Id d'un étudiant du nom et de l'ID de l'école.
Merci pour la réponse:
J'ai créé un étudiant pojo qui a les champs suivants - school_id,school_name, student_id et student_name et les getter et setter pour eux. C'est mon analyseur de mise en œuvre. Quand je parse le xml, j'ai besoin de mettre les valeurs de l'école nom, l'id , le nom de l'étudiant, de l'id dans le pojo et de le retourner. Pouvez-vous me dire comment je doit mettre en œuvre la pile pour la différenciation. C'est mon analyseur de cadre::
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);
}
}
- Consultez également: stackoverflow.com/questions/1863250 - Il y a certains projets qui vous permettent d'utiliser un sous-ensemble de XPath avec un flux de document. Si vous pouvez l'adapter à votre problème dans ce sous-ensemble, le code résultant est infiniment préférable à toute roulés à la main SAX code du gestionnaire.
- SAX analyse de contexte, c'est comme une machine d'état: en.wikipedia.org/wiki/Finite-state_machine, vous avez besoin d'avoir quelques-unes des options que vous pouvez activer/désactiver pour savoir où vous êtes, mais il peut rapidement devenir très confus et vous devriez envisager des solutions de rechange avant d'aller trop loin.
Vous devez vous connecter pour publier un commentaire.
Bien, je n'ai pas joué depuis des années avec le SAX en Java, donc voici mon prendre sur elle:
schools.xml
contient votre exemple XML. Veuillez noter que je l'ai bourré le tout dans un seul fichier, mais ce n'est que pour j'étais en train de jouer.Dans un analyseur SAX vous sont donnés à chaque élément dans l'ordre du document. Vous devez maintenir une pile pour le suivi de la nidification (push sur la pile lors de la manipulation de startElement, et de la pop pour endElement). Vous pouvez différencier les différents
<Name>
éléments par ce qui est actuellement sur la pile.Sinon, il suffit de garder une variable que vous indique si vous avez rencontré un
<School>
tag ou<Student>
tag pour vous dire le type de<Name>
vous voyez.Oui, la compréhension xml à l'aide d'un analyseur SAX est généralement un peu plus compliqué que de travailler avec les DOM. fondamentalement, vous avez besoin pour maintenir l'état/le contexte de votre analyseur SAX, de sorte que vous pouvez faire la distinction entre les situations.
remarque, l'autre clé de la mise en œuvre d'un SAXO gestionnaire est de comprendre que les valeurs peuvent être répartis sur plusieurs caractère événements.
Sax est basée sur les événements, via des rappels, vous pouvez lire le document XML en série. Sax est bon pour la lecture de documents XML volumineux que l'ensemble du document n'est pas chargé en mémoire. Vous voudrez peut-être regarder à Xpath, par exemple
son travail avec moi