Parsear un XML con SAX
Artículo por Club Developers · 25 mayo 2006
2499 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


