Imaginons le fichier XML suivant, qui représente un "annuaire" :
Annuaire XML <annuaire>
<personne id="0">
<nom>nom0</nom>
<prenom>prenom0</prenom>
<adresse>adresse0</adresse>
</personne>
<personne id="1">
<nom>nom1</nom>
<prenom>prenom1</prenom>
<adresse>adresse1</adresse>
</personne>
</annuaire>
Voici un simple JavaBean Personne nous permettant de représenter une entrée dans cet annuaire :
Personne public class Personne{
private int id;
private String nom, prenom, adresse;
public Personne(){}
public int getId(){return id;}
public String getNom(){return nom;}
public String getPrenom(){return prenom;}
public String getAdresse(){return adresse;}
public void setId(int id){this.id = id;}
public void setNom(String nom){this.nom = nom;}
public void setPrenom(String prenom){this.prenom = prenom;}
public void setAdresse(String adresse){this.adresse = adresse;}
public String toString(){
return new StringBuffer("Nom : ").append(nom).append(", ")
.append("Prenom : ").append(prenom).append(", ")
.append("Adresse : ").append(adresse)
.toString();
}
}
Finalement, voici le DefaultHandler nous permettant le parsing du XML. Le parsing va simplement récupérer une List de Personne.
PersonneHandler public class PersonneHandler extends DefaultHandler{
private List<Personne> annuaire;
private Personne personne;
private boolean inAnnuaire, inPersonne, inNom, inPrenom, inAdresse;
private StringBuffer buffer;
public PersonneHandler(){
super();
}
public void startElement(String uri, String localName,
String qName, Attributes attributes) throws SAXException{
if(qName.equals("annuaire")){
annuaire = new LinkedList<Personne>();
inAnnuaire = true;
}else if(qName.equals("personne")){
personne = new Personne();
try{
int id = Integer.parseInt(attributes.getValue("id"));
personne.setId(id);
}catch(Exception e){
throw new SAXException(e);
}
inPersonne = true;
}else {
buffer = new StringBuffer();
if(qName.equals("nom")){
inNom = true;
}else if(qName.equals("prenom")){
inPrenom = true;
}else if(qName.equals("adresse")){
inAdresse = true;
}else{
throw new SAXException("Balise "+qName+" inconnue.");
}
}
}
public void endElement(String uri, String localName, String qName)
throws SAXException{
if(qName.equals("annuaire")){
inAnnuaire = false;
}else if(qName.equals("personne")){
annuaire.add(personne);
personne = null;
inPersonne = false;
}else if(qName.equals("nom")){
personne.setNom(buffer.toString());
buffer = null;
inNom = false;
}else if(qName.equals("prenom")){
personne.setPrenom(buffer.toString());
buffer = null;
inPrenom = false;
}else if(qName.equals("adresse")){
personne.setAdresse(buffer.toString());
buffer = null;
inAdresse = false;
}else{
throw new SAXException("Balise "+qName+" inconnue.");
}
}
public void characters(char[] ch,int start, int length)
throws SAXException{
String lecture = new String(ch,start,length);
if(buffer != null) buffer.append(lecture);
}
public void startDocument() throws SAXException {
System.out.println("Début du parsing");
}
public void endDocument() throws SAXException {
System.out.println("Fin du parsing");
System.out.println("Resultats du parsing");
for(Personne p : annuaire){
System.out.println(p);
}
}
}
L'utilisation de ces trois éléments se fait simplement comme ceci :
SAXParserFactory fabrique = SAXParserFactory.newInstance();
SAXParser parseur = fabrique.newSAXParser();
File fichier = new File("./ExempleSAX.xml");
DefaultHandler gestionnaire = new PersonneHandler();
parseur.parse(fichier, gestionnaire);
Il existe des API plus avancées que SAX pour lier des fichiers XML et des Object Java. L'exemple ci-dessus sert juste de démonstration.
|