à 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.
InformationsquelleAutor Srinivas | 2011-08-26