Parsear un XML con SAX
Artículo por Club Developers · 25 mayo 2006
2157 vistas
Imaginemos el fichero XML siguiente que representa una agenda:
Veamos un sencillo JavaBean Persona que nos permita representar una entrada en esta agenda:
Ahora veamos el DefaultHandler que nos permita el parsing del XML. El parsing simplemente recuperará una List de Persona.
El uso de estos tres elementos se hace sencillamete asÃ:
xml
<agenda> Â <persona id="0"> Â Â Â <nombre>nombre0</nombre> Â Â Â <apellido>apellido0</apellido> Â Â Â <direccion>direccion0</direccion> Â </persona> Â <persona id="1"> Â Â Â <nombre>nombre1</nombre> Â Â Â <apellido>apellido1</apellido> Â Â Â <direccion>direccion1</direccion> Â </persona> </agenda>
Veamos un sencillo JavaBean Persona que nos permita representar una entrada en esta agenda:
java
public class Persona{  private int id;  public Persona(){}  public int getId(){return id;}  public void setId(int id){this.id = id;}    .append("Apellido: ").append(apellido).append(", ")    .append("Dirección: ").append(direccion)    .toString();  } }
Ahora veamos el DefaultHandler que nos permita el parsing del XML. El parsing simplemente recuperará una List de Persona.
java
public class PersonaHandler extends DefaultHandler{  // resultados de nuestro parser  private List<Persona> agenda;  private Persona persona;  // flags que nos indicarán la posición del parser  private boolean inAgenda, inPersona, inNombre, inApellido, inDireccion;  // buffer que nos permitirá recuperar los datos  // constructor  public PersonaHandler(){    super();  }  // detección de obertura de etiqueta    if(qName.equals("agenda")){     agenda = new LinkedList<Persona>();     inAgenda = true;    }else if(qName.equals("persona")){     persona = new Persona();     try{       persona.setId(id);     // error, el contenido de Id no es un entero       throw new SAXException(e);     }     inPersona = true;    }else {     if(qName.equals("nombre")){       inNombre = true;     }else if(qName.equals("apellido")){       inApellido = true;     }else if(qName.equals("direccion")){       inDireccion = true;     }else{       // error, provocamos excepción       throw new SAXException("Etiqueta "+qName+" desconocida.");     }    }  }  // detección fin etiqueta         throws SAXException{    if(qName.equals("agenda")){     inAgenda = false;    }else if(qName.equals("persona")){     agenda.add(persona);     persona = null;     inPersona = false;    }else if(qName.equals("nombre")){     persona.setNombre(buffer.toString());     buffer = null;     inNombre = false;    }else if(qName.equals("apellido")){     persona.setApellido(buffer.toString());     buffer = null;     inApellido = false;    }else if(qName.equals("direccion")){     persona.setDireccion(buffer.toString());     buffer = null;     inDireccion = false;    }else{     // error, provocamos excepción     throw new SAXException("Etiqueta "+qName+" desconocida.");    }      }  // detección de carácteres  public void characters(char[] ch,int start, int length)         throws SAXException{    if(buffer != null) buffer.append(lectura);  }  // inicio parsing  public void startDocument() throws SAXException {  }  // fin parsing  public void endDocument() throws SAXException {   for(Persona p : agenda){   }  } }
El uso de estos tres elementos se hace sencillamete asÃ:
java