Ci contre une courte description de blibliothèque, concernant 3 livres, écrite sans déclaration de type de document. La syntaxe xml est correcte, le document est bien formé; cependant il ne sera pas valide par rapport à une DTD simple qui décrirait les deux premiers livres, par exemple. Nous ignorons l'aspect validation pour ce premier exemple. Nous utilisons un analyseur SAX (simple API four Xml) pour la parcourir en lui demandant simplement de fournir un affichage, à chaque balise rencontrée: le nom de la blaise, ses attributs, le contenu texte.
|
<?xml version="1.0"?> <bibliotheque> <livre> <titre>titre livre 1</titre> <auteur>auteur 1</auteur> <editeur>editeur 1</editeur> </livre> <livre> <titre>titre livre 2</titre> <auteur>auteur 2</auteur> <editeur>editeur 2</editeur> </livre> <livre titre="titre 3" auteur="auteur 3" editeur="editeur 3"> 3 </livre> </bibliotheque> |
Principe de fonctionnement de l'analyseur:
lors parcours du texte html, un certains nombres de rencontres
ont lieu pendant le parcours du texte, comme la rencontre d'une balise
ouvrante, d'une balise fermante, d'un contenu de balise ... Lors de
chaque rencontre, l'analyseur appelle une méthode spécifique à la
rencontre: startElement, endElement, characters ...
Il suffit au programmeur de coder ces méthodes suivant le genre de
traitement qu'il veut effectuer.
En fait le programmeur définit une classe contenant ces méthodes (ou
les surcharge) et la communique à l'analyseur.
Remarquons que les présentations courantes mentionnent des événements déclenchés par l'analyseur à la rencontre des balises ... et le programmeur doit écrire une classe gestionnaire d'événements ou étendre une classe déjà définie, comme DefaultHandler par exemple.
Dans la programmation ci-dessous, le texte xml est déclaré comme chaîne de caractères directement dans le source. Nous présentons d'abord les classes utilisées, puis les classes conçues; la classe XmlUn contient la méthode main et la méthode analyser qui met en place l'analyseur; la classe GereBalise contient les méthodes appelées par l'analyseur à chaque rencontre de balise.
→ Classes utilisées// Flot associé à une chaîne en mémoire import java.io.StringReader; // Lien entre flot et analyseur import org.xml.sax.InputSource; // Réponses standards à l'analyseur import org.xml.sax.helpers.DefaultHandler; // Pour les attributs d'une balise import org.xml.sax.Attributes; // Deux classes abstraites (pour avoir un analyseur) import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory;→ Mise en place de l'analyseur
public class XmlUn { static final String DONNEES_XML = "lt;?xml version=\"1.0\"?>\n" +"lt;bibliotheque\n>" +" lt;livre>\n" +" lt;titre>titre livre 1lt;/titre>\n" +" lt;auteur>auteur 1lt;/auteur>\n" +" lt;editeur>editeur 1lt;/editeur>\n" +" lt;/livre>\n" +" lt;livre>\n" +" lt;titre>titre livre 2lt;/titre>\n" +" lt;auteur>auteur 2lt;/auteur>\n" +" lt;editeur>editeur 2lt;/editeur>\n" +" lt;/livre>\n" +" lt;livre titre=\"titre 3\" auteur=\"auteur 3\" editeur=\"editeur 3\" >3" +" lt;/livre>\n" +"lt;/bibliotheque>\n"; public static void main(java.lang.String[] args) { XmlUn m = new XmlUn(); m.analyser(); } public void analyser() { GereBalise gere = new GereBalise(); System.out.println("Lancement du parseur"); try { SAXParserFactory fac = SAXParserFactory.newInstance(); SAXParser pp = fac.newSAXParser(); pp.parse(new InputSource(new StringReader(DONNEES_XML)),gere); } catch (Exception e) { e.printStackTrace(System.out); return; } } }→ Traitement souhaité
/** Pour gérer les événements SAX lors du traitement du texte XML */ class GereBalise extends DefaultHandler { public GereBalise() { super(); } /** Actions à réaliser sur les données */ public void characters(char[] caracteres, int debut, int longueur) { String donnees = new String(caracteres, debut, longueur); System.out.println(" valeur = *" + donnees + "*"); } /** Au début du document. */ public void startDocument() { System.out.println("Debut du document"); } /** * A la fin du document XML. */ public void endDocument() { System.out.println("Fin du document"); } /** Détection d'un élément. */ public void startElement( String uri, String localName , String name, Attributes atts) { System.out.println("debut tag : " + name); int na=atts.getLength(); // nb attributs if(na>0) { System.out.print(" -> "); for(int i=0; i<na; i++) System.out.print(" "+atts.getQName(i)+"='"+atts.getValue(i)+"'"); System.out.println(""); } } /** Détection de la fin d'un élément. */ public void endElement(String uri, String localName, String name) { System.out.println("Fin tag "+name); } }