¿Es posible dar expresiones de ruta en el analizador SAX? Tengo un archivo XML que tiene algunas etiquetas con el mismo nombre, pero están en un elemento diferente. ¿Hay alguna forma de diferenciar entre ellos? Aquí es el XML:usando el analizador SAX, ¿cómo se analiza un archivo xml que tiene las mismas etiquetas pero en diferentes elementos?
<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>
quiero diferenciar entre el nombre y la identificación de un estudiante del nombre y la identificación de una escuela.
Gracias por la respuesta:
he creado un POJO estudiante que tiene la siguiente campos- school_id, school_name, student_id y métodos student_name y get y set para ellos. Esta es mi implementación de analizador temporal. Cuando analizo el xml, necesito poner los valores de nombre de la escuela, identificación, nombre del estudiante, identificación en el pojo y devolverlo. ¿Puede decirme cómo debería implementar la pila para la diferenciación? Esta es mi estructura de analizador ::
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);
}
}
También puedes ver: http://stackoverflow.com/questions/1863250/ - Hay algunos proyectos que le permiten utilizar un subconjunto de XPath con un documento de streaming. Si puede adaptar su problema a ese subconjunto, el código resultante sería ampliamente preferible a cualquier código de controlador SAX enrollado a mano. –
El análisis SAX con contexto es como una máquina de estado: https://en.wikipedia.org/wiki/Finite-state_machine, necesita tener algunos indicadores que puede activar/desactivar para saber dónde se encuentra, pero puede hacerlo rápidamente. se vuelven muy desordenados y debes considerar alternativas antes de ir demasiado lejos. –