Le DOM Document Object Model

 

1. création du Dom à partir d'un fichier xml et parcours

Création de l'arbre d'élément du document selon le DOM Document Object Model, puis parcours de cet arbre pour afficher les noeuds et leurs caractéristiques.

Programme

// Dom1.java

import java.io.*;
import org.w3c.dom.*;
import org.xml.sax.*;
import javax.xml.parsers.*;
import com.sun.xml.tree.*;
import com.sun.xml.parser.*;
import org.xml.sax.helpers.*;
import com.sun.xml.tree.*;
     et un plat de packages,un !

public class Dom1 
{
    public static void main (String argv [])
    throws IOException
    {
	if (argv.length != 1) {
	    System.err.println ("Usage: cmd filename");
	    System.exit (1);
	}
	try {
	       InputSource     input;
        org.xml.sax.Parser  parser;
        XmlDocumentBuilder  builder;
        XmlDocument    document;
        Element        rootElement;
          
        input = Resolver.createInputSource (new File (argv [0]));
        builder = new XmlDocumentBuilder ();
           utilise le constructeur par défaut de DOM 
        parser = ParserFactory.makeParser ("com.sun.xml.parser.ValidatingParser");
        parser.setDocumentHandler (builder);
        parser.parse (input);
        document = builder.getDocument ();
           récupère le document en forme Dom
        rootElement = (Element) document.getDocumentElement();
           récupère la racine de l'arbre
        TreeWalker arbre = new TreeWalker(rootElement); 
           prépare un parcours d'arbre en profondeur d'abord
        Node noeud = arbre.getCurrent();
        System.out.println("TreeWalker noeud root :"
        			      +noeud.getNodeName());
           Nom d'un noeud de l'arbre Dom
        while ((noeud = arbre.getNext()) != null) {          
            prend le prochain noeud selon le parcours d'arbre
         System.out.println("noeud name  : "
        			+arbre.getCurrent().getNodeName());
          String type;
          switch (arbre.getCurrent().getNodeType()) {
           Type d'un noeud de l'arbre Dom
            case ElementNode.ATTRIBUTE_NODE :	
              		type = "attribut"; break;  
            case ElementNode.CDATA_SECTION_NODE :	
              		type = "CDATA"; break;    
            case ElementNode.COMMENT_NODE :	
              		type = "comment"; break; 
            case ElementNode.DOCUMENT_FRAGMENT_NODE : 
              		type = "document fragment"; break;   
            case ElementNode.DOCUMENT_NODE :	
              		type = "document"; break; 
            case ElementNode.DOCUMENT_TYPE_NODE :	
              		type = "document type"; break; 
            case ElementNode.ELEMENT_NODE :	
              		type = "element"; break; 
            case ElementNode.ENTITY_NODE :	
              		type = "entity"; break; 
            case ElementNode.ENTITY_REFERENCE_NODE :	
              		type = "entity reference"; break; 
            case ElementNode.NOTATION_NODE :	
              		type = "notation"; break; 
            case ElementNode.PROCESSING_INSTRUCTION_NODE : 
              		type = "processing instruction"; break; 
            case ElementNode.TEXT_NODE :	
              		type = "text"; break;
            default : type = "none"; 
          }
          System.out.println("       type : " + type);        
          System.out.println("      value : "
        			+arbre.getCurrent().getNodeValue());
           Valeur d'un noeud de l'arbre Dom
        } 			         
	} catch (Throwable t) {
	    t.printStackTrace ();
	}
	System.exit (0);
    }

 }

commandes et résultats

$ javac Dom1.java
$ java Dom1 dialogue7.xml
TreeWalker noeud root :dialogue
noeud name  : situation
       type : element
      value : null
noeud name  : #text
       type : text
      value : acte I, Scene 1 : madame pernelle et flipote sa servante,elmire, mariane, dorine, damis, cléante.
noeud name  : replique
       type : element
      value : null
noeud name  : personnage
       type : element
      value : null
noeud name  : #text
       type : text
      value : madame pernelle
noeud name  : texte
       type : element
      value : null
noeud name  : #text
       type : text
      value : Allons, Flipote, allons, que d'eux je me délivre.
noeud name  : replique
       type : element
      value : null
noeud name  : personnage
       type : element
      value : null
noeud name  : #text
       type : text
      value : elmire
noeud name  : texte
       type : element
      value : null
noeud name  : #text
       type : text
      value : Vous marchez d'un tel pas qu'on a peine à vous suivre.
noeud name  : replique
       type : element
      value : null
noeud name  : personnage
       type : element
      value : null
noeud name  : #text
       type : text
      value : madame pernelle
noeud name  : texte
       type : element
      value : null
noeud name  : #text
       type : text
      value : Laissez, ma bru, laissez, ne venez pas plus loin: Ce sont toutes façons dont je n'ai pas besoin.
noeud name  : replique
       type : element
      value : null
noeud name  : personnage
       type : element
      value : null
noeud name  : #text
       type : text
      value : elmire
noeud name  : texte
       type : element
      value : null
noeud name  : #text
       type : text
      value : De ce que l'on vous doit envers vous on s'acquitte, Mais ma mère, d'où vient que vous sortez si vite;
$

 

 2. Qu'est-ce que DOM ?

 

3. transformation du document

Création de l'arbre d'élément du document selon le DOM Document Object Model, puis modification de cet arbre pour intervertir l'ordre des éléments 'texte' et 'personnage' au sein de 'replique'.

Programme

// Dom2.java

import java.io.*;
import org.w3c.dom.*;
import org.xml.sax.*;
import javax.xml.parsers.*;
import com.sun.xml.tree.*;
import com.sun.xml.parser.*;
import org.xml.sax.helpers.*;
import com.sun.xml.tree.*;

public class Dom2 
{
    public static void main (String argv [])
    throws IOException
    {
	  if (argv.length != 1) {
	    System.err.println ("Usage: cmd filename");
	    System.exit (1);
	}
	try {
	  InputSource     input;
      org.xml.sax.Parser  parser;
      XmlDocumentBuilder  builder;
      XmlDocument document;
      Element rootElement;        
      input = Resolver.createInputSource (new File(argv[0]));
      builder = new XmlDocumentBuilder();
      parser = ParserFactory.makeParser
            ("com.sun.xml.parser.ValidatingParser");
      parser.setDocumentHandler (builder);
      parser.parse (input);
      document = builder.getDocument ();
      rootElement = (Element) document.getDocumentElement () ;
      TreeWalker arbre = new TreeWalker(rootElement); 
      Node noeud = arbre.getCurrent();
      while ((noeud = arbre.getNext()) != null) {          
        if (noeud.getNodeName().equals("replique")) {
          Node replique = noeud;
          while ((noeud != null) && 
                 !noeud.getNodeName().equals("personnage"))
            noeud = arbre.getNext(); 
          Node personnage = null;
          if (noeud.getNodeName().equals("personnage")) 
            personnage = noeud;
          while ((noeud != null) && 
                  !noeud.getNodeName().equals("texte"))
            noeud = arbre.getNext(); 
          Node texte = null;
          if (noeud.getNodeName().equals("texte")) 
              texte = noeud;
          if ((personnage != null) && (texte != null)) 
            replique.insertBefore(texte, personnage);
            insérer le noeud 'texte' avant le noeud 'personnage' 
            dans la liste des noeuds descendants de 'replique', 
            et enlever sa précédente occurrence 
        }
      }
      document.write(System.out);			         
        ecriture du document en format UTF-8 (variante Unicode)
	} catch (Throwable t) {
	    t.printStackTrace ();
	}
	System.exit (0);
    }
 }

commandes et résultats

$ javac Dom2.java
$ java Dom2 dialogue7.xml

<?xml version="1.0"  encoding="UTF-8"?>
<!-- fichier dia6.xml -->
<!-- fichier dia2.dtd -->
<!-- dtd dialogue -->
<!-- extrait de Tartuffe de Molière -->
    c'est de l'UTF-8 (variante Unicode): codage variable 
    de 1 à 6 octets pour un caractère, soit 1 octet pour 
    l'ASCII 7 bits, 2 pour les autres caractères de 
    l'ISO-Latin
<dialogue>
  <situation>acte I, Scene 1 : madame pernelle et flipote sa servante,elmire, mariane, dorine, damis, cléante.</situation>
  <replique>
    <texte>Allons, Flipote, allons, que d'eux je me délivre.</texte>
    <personnage>madame pernelle</personnage>
  </replique>
  <replique>
    <texte>Vous marchez d'un tel pas qu'on a peine à vous suivre.</texte>
    <personnage>elmire</personnage>
  </replique>
  <replique>
    <texte>Laissez, ma bru, laissez, ne venez pas plus loin: Ce sont toutes façons dont je n'ai pas besoin.</texte>
    <personnage>madame pernelle</personnage>
  </replique>
  <replique>
    <texte>De ce que l'on vous doit envers vous on s'acquitte, Mais ma mère, d'où vient que vous sortez si vite;</texte>
    <personnage>elmire</personnage>
  </replique>
<dialogue>

4. création d'un arbre "Dom" et sauvegarde sous forme d'un flot au format xml

Création directement de l'arbre selon le DOM Document Object Model, à l'aide de méthode de création de noeud et de d'insertion de noeud dans l'arbre, puis sauvegarde de cet arbre sous format "fichier xml"

Programme

// Creer_dom_expr.java
 
import com.sun.xml.tree.XmlDocument;
import com.sun.xml.tree.ElementNode;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.io.IOException;
import org.w3c.dom.*;

public class Creer_dom_expr { 
  public static void main (String argv []) {
    XmlDocument doc = new XmlDocument();
           création d'un nouveau document (sous forme 
           de représentation interne d'arbre Node)
    ElementNode	expressionLevel_0 = 
          (ElementNode)doc.createElement("expression");
           création d'un nouvel élément
    doc.appendChild(expressionLevel_0);
           ajout d'un fils à un noeud
    ElementNode	termeLevel_1a = 
          (ElementNode)doc.createElement("terme");
           création d'un nouvel élément ..........IDEM
    expressionLevel_0.appendChild(termeLevel_1a);
    ElementNode facteurLevel_2a = 
          (ElementNode)doc.createElement("facteur");
    termeLevel_1a.appendChild(facteurLevel_2a);
    ElementNode	variableLevel_3 = 
          (ElementNode)doc.createElement("variable");
    facteurLevel_2a.appendChild(variableLevel_3);
    Text texteLevel_4 = doc.createTextNode("TOTO");
           création d'un noeud text
    variableLevel_3.appendChild(texteLevel_4); 
    ElementNode	operateurLevel_1 = 
          (ElementNode)doc.createElement("op_plus");
    expressionLevel_0.appendChild(operateurLevel_1);
    ElementNode	termeLevel_1b = 
          (ElementNode)doc.createElement("terme");
    expressionLevel_0.appendChild(termeLevel_1b);
    ElementNode facteurLevel_2b = 
          (ElementNode)doc.createElement("facteur");
    termeLevel_1b.appendChild(facteurLevel_2b);
    ElementNode parentGLevel_3 = 
          (ElementNode)doc.createElement("paren_g"); 
    facteurLevel_2b.appendChild(parentGLevel_3);
    ElementNode	expressionLevel_3 = 
          (ElementNode)doc.createElement("expression");
    facteurLevel_2b.appendChild(expressionLevel_3);
    ElementNode parentDLevel_3 = 
          (ElementNode)doc.createElement("paren_d"); 
    facteurLevel_2b.appendChild(parentDLevel_3);
    ElementNode	termeLevel_4 = 
          (ElementNode)doc.createElement("terme");
    expressionLevel_3.appendChild(termeLevel_4);
    ElementNode facteurLevel_5a = 
          (ElementNode)doc.createElement("facteur");
    termeLevel_4.appendChild(facteurLevel_5a);
    ElementNode	operateurLevel_5 = 
          (ElementNode)doc.createElement("op_mult");
    termeLevel_4.appendChild(operateurLevel_5);
    ElementNode facteurLevel_5b = 
          (ElementNode)doc.createElement("facteur");
    termeLevel_4.appendChild(facteurLevel_5b);
    ElementNode	contanteLevel_6 = 
          (ElementNode)doc.createElement("contante");
    facteurLevel_5a.appendChild(contanteLevel_6);
    Text texteLevel_7a = doc.createTextNode("1024");
    contanteLevel_6.appendChild(texteLevel_7a); 
    ElementNode	variableLevel_6 = 
          (ElementNode)doc.createElement("variable");
    facteurLevel_5b.appendChild(variableLevel_6);
    Text texteLevel_7b = doc.createTextNode("TITI");
    variableLevel_6.appendChild(texteLevel_7b); 
    try {
      Writer out = new OutputStreamWriter(System.out);
      doc.write(out , "ISO-8859-1");
           écriture du document xml sur un flot en 
           encodage fr-latin
    } catch (IOException e) {
      System.out.println(e.getMessage());
    }
  }
}   
 

commandes et résultats

$ java Creer_dom_expr
<?xml version="1.0" encoding="ISO-8859-1"?>

<expression>
  <terme>
    <facteur>
      <variable>TOTO</variable>
    </facteur>
  </terme>
  <op_plus />
  <terme>
    <facteur>
      <paren_g />
      <expression>
        <terme>
          <facteur>
            <contante>1024</contante>
          </facteur>
          <op_mult />
          <facteur>
            <variable>TITI</variable>
          </facteur>
        </terme>
      </expression>
      <paren_d />
    </facteur>
  </terme>
</expression>

explications :

la DTD serait :

 <!ELEMENT expression (<terme>,(<op_plus>,<terme>)*)>
 <!ELEMENT terme (<facteur>,(<op_mult>,<facteur>)*)>
 <!ELEMENT facteur (<variable>|<constante>
                    |(<parent_g><expression><parent_d>)>
 <!ELEMENT op_plus EMPTY>
 <!ELEMENT op_mult EMPTY> 
 <!ELEMENT variable (#PCDATA)>
 <!ELEMENT constante (#PCDATA)>
 <!ELEMENT parent_g EMPTY> 
 <!ELEMENT parent_d EMPTY>

l'exemple traité est :

 

  
   

 index  suivant