Crear o modificar un fichero XML con SAX y XSLT
Artículo por Club Developers · 27 mayo 2006
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:
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
AgendaSource
AgendaReader
Ejemplo de uso:
- 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
public class Persona{ private int id; public Persona(){} public int getId(){return id;} public void setId(int id){this.id = id;} .append("Nombre : ").append(nombre).append(", ") .append("Apellido : ").append(apellido).append(", ") .append("Direccion : ").append(direccion) .toString(); } }
AgendaSource
java
public class AgendaSource extends InputSource{ private List<Persona> personas; public AgendaSource(List<Persona> personas){ super(); this.personas = personas; } public List<Persona> getPersonas(){ return personas; } }
AgendaReader
java
public class AgendaReader implements XMLReader{ private AttributesImpl atts = new AttributesImpl(); //métodos que serán usados por el transformer return handler; } this.handler = handler; } // parsing de une lista de personas if(!(input instanceof AgendaSource)){ throw new SAXException(m); } if(handler == null){ throw new SAXException("Sin ContentHandler"); } AgendaSource source = (AgendaSource)input; List<Persona> personas = source.getPersonas(); handler.startDocument(); handler.startElement("", "agenda", "agenda", atts); for(Persona p : personas){ handler.startElement("", "persona", "persona", atts); atts.clear(); handler.startElement("", "nombre", "nombre", atts); char[] nombre = p.getNombre().toCharArray(); handler.characters(nombre,0,nombre.length); handler.endElement("", "nombre", "nombre"); handler.startElement("", "apellido", "apellido", atts); char[] apellido = p.getApellido().toCharArray(); handler.characters(apellido,0,apellido.length); handler.endElement("", "apellido", "apellido"); handler.startElement("", "direccion", "direccion", atts); char[] direccion = p.getDireccion().toCharArray() ; handler.characters(direccion,0,direccion.length); handler.endElement("", "direccion", "direccion"); handler.endElement("", "persona", "persona"); } handler.endElement("", "agenda", "agenda"); handler.endDocument(); } throw new SAXException(m); } // otros métodos a implementar }
Ejemplo de uso:
java
// Creación de la agenda List<Persona> agenda = new ArrayList<Persona>(); // ... //rellenado de la agenda // Creación del source DOM XMLReader agendaReader = new AgendaReader(); InputSource agendaSource = new AgendaSource(agenda); Source source = new SAXSource(agendaReader, agendaSource); // Creación del fichero de salida Result resultado = new StreamResult(file); // Configuración del transformer TransformerFactory factory = TransformerFactory.newInstance(); Transformer transformer = factory.newTransformer(); transformer.setOutputProperty(OutputKeys.INDENT, "yes"); transformer.setOutputProperty(OutputKeys.ENCODING, "ISO-8859-1"); // Transformación transformer.transform(source, resultado);