È possibile fornire espressioni di percorso nel parser SAX? Ho un file XML che ha alcuni tag con lo stesso nome, ma sono in elementi diversi. C'è un modo per differenziare tra loro. Ecco l'XML:utilizzando parser SAX, come si analizza un file xml che ha lo stesso nome ma in elementi diversi?
<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>
voglio distinguere tra il nome e l'ID di uno studente il nome e l'ID di una scuola.
Grazie per la risposta:
ho creato un POJO studente che ha il seguente settori- school_id, school_name, student_id e metodi student_name e getter e setter per loro. Questa è la mia implementazione temporanea del parser. Quando analizzo l'xml, devo inserire i valori del nome della scuola, id, nome dello studente, id nel pojo e restituirlo. Puoi dirmi su come dovrei implementare lo stack per la differenziazione. Questo è il mio framework del parser ::
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);
}
}
Verificate anche: http://stackoverflow.com/questions/1863250/ - Ci sono alcuni progetti che consentono di utilizzare un sottoinsieme di XPath con un documento in streaming. Se riesci ad adattare il tuo problema a quel sottoinsieme, il codice risultante sarebbe di gran lunga preferibile a qualsiasi codice di gestore SAX laminato a mano. –
L'analisi SAX con contesto è come una macchina a stati: https://en.wikipedia.org/wiki/Finite-state_machine, è necessario disporre di alcune bandiere che è possibile attivare/disattivare per sapere dove ci si trova, ma può rapidamente diventare molto caotico e dovresti considerare le alternative prima di andare troppo lontano. –