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'.
Ce programme comporte plusieures méthodes pratiques : parcours
d'arbre, recherche d'élément par son nom, affichage
de l'arbre.
// Dom2.java
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.FactoryConfigurationError;
import javax.xml.parsers.ParserConfigurationException;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
import java.io.File;
import java.io.IOException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.DOMException;
public class Dom2
{
public static void main (String argv [])
throws IOException
{
if (argv.length != 1) {
System.err.println ("Usage: cmd filename");
System.exit (1);
}
DocumentBuilderFactory factory =
DocumentBuilderFactory.newInstance();
try {
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(new File(argv[0]));
Element rootElement = document.getDocumentElement () ;
modifieDomTree (rootElement);
printDomTree (document, "");
} catch (Throwable t) {
t.printStackTrace ();
System.exit (1);
}
System.exit (0);
}
public static void modifieDomTree (Node node)
// methode qui recherche les éléments replique puis
// intervertit les sous-éléments personnage et texte
{
Node repliqueNode = getNextNode(node, "replique");
while (repliqueNode != null) {
Node personneNode = getNextNode (repliqueNode,"personnage");
Node texteNode = getNextNode (repliqueNode, "texte");
if ((personneNode != null) && (texteNode != null))
repliqueNode.insertBefore(texteNode, personneNode);
// insérer le noeud 'texte' avant le noeud 'personnage'
// dans la liste des noeuds descendants de 'replique',
// et enlever sa précédente occurrence
repliqueNode = repliqueNode.getNextSibling();
}
}
public static Node getNextNode (Node node, String name )
// methode qui recherche le premier élément de
// nom name dans le sous-arbre dom de racine "node"
// selon un parcours en profondeur d'abord
{
if (node.getNodeName().equals(name))
return node;
if (node.hasChildNodes()) {
Node goodNode = null;
NodeList list = node.getChildNodes();
for (int i = 0; i < list.getLength(); i ++) {
goodNode = getNextNode(list.item(i),name) ;
if (goodNode != null)
return goodNode;
}
return null;
} else
return null;
}
public static void printDomTree (Node node, String indent)
// methode qui affiche le sous-arbre
{
System.out.println(indent+"noeud name : "+node.getNodeName());
System.out.println(indent+"value : "+node.getNodeValue());
if (node.hasChildNodes()) {
Node nextFils = node.getFirstChild();
while (nextFils != null) {
printDomTree (nextFils, indent+" ");
nextFils = nextFils.getNextSibling();
}
}
}
}
$ java Dom2 dialogue7.xml noeud name : dialogue value : null noeud name : situation value : null noeud name : #text value : acte I, Scene 1 : madame pernelle et flipote sa servante,elmire, mariane, dorine, damis, cléante. noeud name : replique value : null noeud name : texte value : null noeud name : #text value : Allons, Flipote, allons, que d'eux je me délivre. noeud name : personnage value : null noeud name : #text value : madame pernelle noeud name : replique value : null noeud name : texte value : null noeud name : #text value : Vous marchez d'un tel pas qu'on a peine à vous suivre. noeud name : personnage value : null noeud name : #text value : elmire ....exercice :
Modifier l'arbre de telle sorte que la situation se trouve a la fin après les répliques.