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'.
Ce programme comporte plusieures méthodes pratiques : parcours d'arbre, recherche d'élément par son nom, affichage de l'arbre.

Programme

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

commandes et résultats

$ 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.


  

 index  suivant