EPITA
XML et les services Web

Jean-François Perrot 

DOM (Document Object Model)


  1. I. Notion de parseur XML, SAX & DOM
    1. Principe général
    2. L'exemple classique de la compilation des programmes
    3. Ce que XML apporte
    4. Modalités
      1. Deux manières de lire un fichier XML : SAX & DOM
      2. Généralités sur DOM 

  2. II. Éléments de base du DOM  (pour le détail des structures en Java, voir le bréviaire)
    1. L'interface org.w3c.dom.Node et sa dérivée org.w3c.dom.NodeList
      1. Principe
      2. Méthodes d'accès "en lecture"
      3. Méthodes d'accès "en écriture"
      4. Sous-interfaces 
      5. Illustration de principe 
    2. L'interface org.w3c.dom.Document
      1. Prinicpe
      2. Pouvoir créateur
    3. L'interface org.w3c.dom.Element

  3. III.Un exemple simple en PHP-5 et en Java
    1. Objectif
    2. Première étape : lire un document Noms-Notes en format 1 (et calculer la moyenne des notes).
      1. En PHP
      2. En Java :
    3. Deuxième étape : même chose, en format 2
      1. En PHP :
      2. En Java :
    4. Troisième étape : construire un document en format 1 à partir d'un fichier texte.
      1. En PHP :
      2. En Java :
      3. Et le codage des caractères ?
    5. Quatrième étape : même chose en format 2
      1. En PHP :
      2. En Java :
    6. Cinquième étape : Transformation d'un fichier Noms-Notes de format 1  à format 2
      1. En PHP :
      2. En Java :
    7. Variation 


I. Notion de parseur XML, SAX & DOM

  1. Principe général

  2. L'exemple classique de la compilation des programmes

    Dans un compilateur (traducteur d'un texte-source en langage-machine) on distingue deux étapes :
    1. l'analyse syntaxique qui transforme le texte-source (écrit en syntaxe concrète)
      en un arbre  (l'arbre syntaxique)
    2. le générateur de code (assembleur) qui travaille sur l'arbre syntaxique.
    Le parseur doit tenir compte

    le même programme en syntaxe C :
    int a, b, q, r ;
    main () {
          scanf("%d", &a); scanf("%d", &b); q = 0; r = a;
          while (r >= b) {
                q = q+1; r = r-b;
        }
          printf("%d", q); printf("%d", r);
        }
    le même programme en syntaxe Ada :
    with Ada.Integer_Text_Io; use Ada.Integer_Text_Io;
    procedure Main is
    a, b, q, r : Integer;
    begin get(a); get(b); q := 0; r := a;
          while r >= b loop q := q+1; r := r-b; end loop;
          put(q); put(r);
    end Main;   

  3. Compilation

    Si on change de syntaxe concrète il faut changer de parseur !
    Il faut aussi changer de parseur si on change la syntaxe abstraite !

    Soulignons que la représentation d'un arbre en machine pose deux niveaux de problèmes :

  4. Ce que XML apporte

    XML offre un moyen pour représenter "directement" l'arbre syntaxique,
    plus exactement, il offre une syntaxe concrète uniforme (mais peu lisible).
    Exemple : le programme ci-dessus en XML
    fichier qr.xml

    <?xml version='1.0'?>
    <Prog>
       <Variables> <Var nom="a"/> <Var nom="b"/> <Var nom="q"/> <Var nom="r"/>
       </Variables>
       <Sequence>
          <Lecture> <Var nom="a"/> </Lecture>
          <Lecture> <Var nom="b"/> </Lecture>
          <Affectation> <Var nom="q"/> <Cte val="0"/> </Affectation>
          <Affectation> <Var nom="r"/> <VarExp> <Var nom="a"/> </VarExp> </Affectation>
          <Boucle>
              <Comparaison op="&gt;="> <VarExp> <Var nom="r"/> </VarExp>
                       <VarExp> <Var nom="b"/> </VarExp>
              </Comparaison>
              <Sequence>
                  <Affectation> <Var nom="q"/>
                      <Bin op="+"> <VarExp> <Var nom="q"/> </VarExp> <Cte val="1"/>
                      </Bin>
                  </Affectation>
                  <Affectation> <Var nom="r"/>
                      <Bin op="-"> <VarExp><Var nom="r"/></VarExp>
                          <VarExp><Var nom="b"/></VarExp>
                      </Bin>
                  </Affectation>
              </Sequence>
          </Boucle>
          <Ecriture> <VarExp> <Var nom="q"/> </VarExp> </Ecriture>
          <Ecriture> <VarExp> <Var nom="r"/> </VarExp> </Ecriture>
        </Sequence>
    </Prog>


    avec le Document Object Model (DOM) il offre aussi une syntaxe abstraite,
    c'est à dire une définition précise des arbres correspondant aux fichiers XML.

  5. Modalités

Dans ce cours, nous nous concentrerons sur la réalisation de DOM en Java.
Pour C++, voir l'implémentation Apache-Xerces.
Sur la réalisation homologue en PHP-5, on lira (outre le Manuel PHP) un excellent
tutoriel introductif chez Développez.com.
La version JavaScript, qui se spécialise dans le traitement de HTML
est quelque peu différente dans le détail, nous n'en parlerons pas ici.

II. Éléments de base du DOM  (pour le détail des structures en Java, voir le bréviaire)

  1. L'interface org.w3c.dom.Node et sa dérivée org.w3c.dom.NodeList

  2. L'interface org.w3c.dom.Document

  3. L'interface org.w3c.dom.Element

    L'interface Element représente un élément (balise) dans un document XML ou HTML.

    Les éléments peuvent avoir des attributs associés ;
    comme l'interface Element hérite de Node, on peut utiliser l'attribut générique attributes
    de l'interface Node pour récupérer le jeu de tous les attributs d'un élément.
    L'interface Element possède des méthodes pour récupérer par leur nom soit un objet Attr,
    soit une valeur d'attribut.

III.Un exemple simple en PHP-5 et en Java