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.
// 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);
}
}
$ 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;
$

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'.
// 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);
}
}
$ 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>
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"
// 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 :