Pour créer un fichier XML avec SAX et XSLT, il nous faut créer une SAXSource. Nous allons prendre l'exemple de l'écriture dans un fichier d'un "annuaire" composé d'une List de JavaBean Personne. Voici les étapes nécessaires à sa création de la source :
- Création du bean : Personne définit un élément de l'annuaire..
- Création d'une InputSource : AnnuaireSource définit la List des personnes de l'annuaire.
- Création d'un XMLReader : AnnuaireReader est capable de "parser" la source pour lever des évènements SAX.
- Création de la SAXSource, à partir de l'InputSource et du Reader.
Après celà la transformation se fera comme pour un arbre DOM et un fichier : avec un Transformer et un StreamResult (pour le fichier de destination).
Personne /**
* Voir zip
*/
AnnuaireSource public class AnnuaireSource extends InputSource{
private List<Personne> personnes;
public AnnuaireSource(List<Personne> personnes){
super();
this.personnes = personnes;
}
public List<Personne> getPersonnes(){
return personnes;
}
}
AnnuaireReader public class AnnuaireReader implements XMLReader{
private ContentHandler handler;
private AttributesImpl atts = new AttributesImpl();
public ContentHandler getContentHandler(){
return handler;
}
public void setContentHandler(ContentHandler handler){
this.handler = handler;
}
public void parse(InputSource input) throws IOException,SAXException{
if(!(input instanceof AnnuaireSource)){
String m = "Le seul argument possible pour parse est une AnnuaireSource";
throw new SAXException(m);
}
if(handler == null){
throw new SAXException("Pas de ContentHandler");
}
AnnuaireSource source = (AnnuaireSource)input;
List<Personne> personnes = source.getPersonnes();
handler.startDocument();
handler.startElement("", "annuaire", "annuaire", atts);
for(Personne p : personnes){
atts.addAttribute("","id","id","",String.valueOf(p.getId()));
handler.startElement("", "personne", "personne", atts);
atts.clear();
handler.startElement("", "nom", "nom", atts);
char[] nom = p.getNom().toCharArray();
handler.characters(nom,0,nom.length);
handler.endElement("", "nom", "nom");
handler.startElement("", "prenom", "prenom", atts);
char[] prenom = p.getPrenom().toCharArray();
handler.characters(prenom,0,prenom.length);
handler.endElement("", "prenom", "prenom");
handler.startElement("", "adresse", "adresse", atts);
char[] adresse = p.getAdresse().toCharArray() ;
handler.characters(adresse,0,adresse.length);
handler.endElement("", "adresse", "adresse");
handler.endElement("", "personne", "personne");
}
handler.endElement("", "annuaire", "annuaire");
handler.endDocument();
}
public void parse(String systemId) throws IOException,SAXException{
String m = "Le seul argument possible pour parse est une AnnuaireSource";
throw new SAXException(m);
}
}
Exemple d'utilisation :
List<Personne> annuaire = new ArrayList<Personne>();
XMLReader annuaireReader = new AnnuaireReader();
InputSource annuaireSource = new AnnuaireSource(annuaire);
Source source = new SAXSource(annuaireReader, annuaireSource);
File file = new File("CreationSAX.xml");
Result resultat = new StreamResult(file);
TransformerFactory fabrique = TransformerFactory.newInstance();
Transformer transformer = fabrique.newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty(OutputKeys.ENCODING, "ISO-8859-1");
transformer.transform(source, resultat);
Téléchargez le code source complet ci-dessous.
|