Crear o modificar un fichero XML con SAX y XSLT

2730 vistas

Para crear un fichero XML con SAX y XSLT, tenemos que crear un SAXSource. Vamos a tomar el ejemplo de la escritura en un fichero de una "agenda" compuesto de una List de JavaBeans Persona. Veamos las etapasa necesarias para la creación:

  • Creación del bean: Persona define un elemento de la agenda.
  • Creación de una InputSource: AgendaSource define la List de personas de la agenda.
  • Creación de un XMLReader: AgendaReader es capaz de "parsear" el código para levantar eventos SAX.
  • Creación de la SAXSource, a partir de la InputSource y del Reader.

Después de esto, la transformación se hará como un árbol DOM y un fichero: con un Transformer y un StreamResult (para el fichero destino).

Persona



java
  1. public class Persona{
  2.   private int id;
  3.   private String nombre, apellido, direccion;
  4.  
  5.   public Persona(){}
  6.  
  7.   public int getId(){return id;}
  8.   public String getNombre(){return nombre;}
  9.   public String getApellido(){return apellido;}
  10.   public String getDireccion(){return direccion;}
  11.  
  12.   public void setId(int id){this.id = id;}
  13.   public void setNombre(String nombre){this.nombre = nombre;}
  14.   public void setApellido(String apellido){this.apellido = apellido;}
  15.   public void setDireccion(String direccion){this.direccion = direccion;}
  16.  
  17.   public String toString(){
  18.       return new StringBuffer("Id : ").append(id).append(", ")
  19.                 .append("Nombre : ").append(nombre).append(", ")
  20.                 .append("Apellido : ").append(apellido).append(", ")
  21.                 .append("Direccion : ").append(direccion)
  22.                 .toString(); 
  23.   }
  24. }



AgendaSource



java
  1. public class AgendaSource extends InputSource{
  2.   private List<Persona> personas;
  3.   public AgendaSource(List<Persona> personas){
  4.       super();
  5.       this.personas = personas;
  6.   }
  7.   public List<Persona> getPersonas(){
  8.       return personas;
  9.   }
  10. }



AgendaReader



java
  1. public class AgendaReader implements XMLReader{
  2.   private ContentHandler handler;
  3.   private AttributesImpl atts = new AttributesImpl();
  4.  
  5.   //métodos que serán usados por el transformer
  6.   public ContentHandler getContentHandler(){
  7.       return handler;
  8.   }
  9.   public void setContentHandler(ContentHandler handler){
  10.       this.handler = handler;
  11.   }
  12.  
  13.   // parsing de une lista de personas
  14.   public void parse(InputSource input) throws IOException,SAXException{
  15.       if(!(input instanceof AgendaSource)){
  16.         String m = "El único parámetro para el parser es un AgendaSource";
  17.         throw new SAXException(m);
  18.       }
  19.       if(handler == null){
  20.         throw new SAXException("Sin ContentHandler");
  21.       }
  22.       AgendaSource source = (AgendaSource)input;
  23.       List<Persona> personas = source.getPersonas();
  24.       handler.startDocument();
  25.       handler.startElement("", "agenda", "agenda", atts);
  26.       for(Persona p : personas){
  27.         atts.addAttribute("","id","id","",String.valueOf(p.getId()));
  28.         handler.startElement("", "persona", "persona", atts);
  29.         atts.clear();
  30.         handler.startElement("", "nombre", "nombre", atts);
  31.         char[] nombre = p.getNombre().toCharArray();
  32.         handler.characters(nombre,0,nombre.length);
  33.         handler.endElement("", "nombre", "nombre");
  34.         handler.startElement("", "apellido", "apellido", atts);
  35.         char[] apellido = p.getApellido().toCharArray();
  36.         handler.characters(apellido,0,apellido.length);
  37.         handler.endElement("", "apellido", "apellido");
  38.         handler.startElement("", "direccion", "direccion", atts);
  39.         char[] direccion = p.getDireccion().toCharArray() ;
  40.         handler.characters(direccion,0,direccion.length);
  41.         handler.endElement("", "direccion", "direccion");
  42.         handler.endElement("", "persona", "persona");
  43.       }
  44.       handler.endElement("", "agenda", "agenda");
  45.       handler.endDocument();
  46.   }
  47.   public void parse(String systemId) throws IOException,SAXException{
  48.       String m = "El único parámetro posible es un AgendaSource";
  49.       throw new SAXException(m);
  50.   }
  51.   // otros métodos a implementar
  52. }



Ejemplo de uso:



java
  1. // Creación de la agenda
  2. List<Persona> agenda = new ArrayList<Persona>();
  3. // ...
  4. //rellenado de la agenda
  5.  
  6. // Creación del source DOM
  7. XMLReader agendaReader = new AgendaReader();
  8. InputSource agendaSource = new AgendaSource(agenda);
  9. Source source = new SAXSource(agendaReader, agendaSource);
  10.  
  11. // Creación del fichero de salida
  12. File file = new File("CreacionSAX.xml");
  13. Result resultado = new StreamResult(file);
  14.  
  15. // Configuración del transformer
  16. TransformerFactory factory = TransformerFactory.newInstance();
  17. Transformer transformer = factory.newTransformer();
  18. transformer.setOutputProperty(OutputKeys.INDENT, "yes");
  19. transformer.setOutputProperty(OutputKeys.ENCODING, "ISO-8859-1");
  20.  
  21. // Transformación
  22. transformer.transform(source, resultado);