UP PREVIOUS NEXT   Technologies Internet et Education, © TECFA
  3. Simple DOM

3. Simple DOM

3.1 Principe de base

Exemple 3-1: Simple application qui affiche les éléments d'un arbre

java SpitElements <nom du fichier>

java SpitElements ../formcont.xml

Les classes de base
import org.apache.xerces.parsers.DOMParser;
import org.w3c.dom.*;
Initialiser un Parseur, parser le document et prendre l'élément root
  DOMParser parser = new DOMParser();
  parser.parse(filename);
  // The document is the root of the DOM tree.
  Document doc = parser.getDocument();
  // Get the Document Element (Top Node)
  Element root = (Element)doc.getDocumentElement();
  // Do something with this Node
  walkDOMBranch(root);
Simple traversé d'un arbre
public static void walkDOMBranch(Node node) {
	
	// print the name and value (characters) of the Node
	System.out.println(node.getNodeName()+":"+node.getNodeValue());
	
	// if the node has children do the same thing for each child
			if (node.hasChildNodes()) {
	    			NodeList nodeList = node.getChildNodes();
	    			int size = nodeList.getLength();
	    			for (int i = 0; i < size; i++) {
					walkDOMBranch(nodeList.item(i));
				}
			}
    } }
A retenir:
  • la méthode de NodeList getLength donne la longeur de la liste
  • la méthode de NodeList item permet d'obtenir l'élément suivant
La classe Element: 

Elements represent most of the "markup" and structure of the document. They contain both the data for the element itself (element name and attributes), and any contained nodes, including document text (as children). Elements may have Attributes associated with them; the API for this is defined in Node, but the function is implemented here.

3.2 Gestion d'erreurs

Le minimum: attraper une exception autour du parse et imprimer un StackTrace
   try { ......
       	parser.parse(filename);
      ......
    } catch (Exception e) {
         System.out.println("Something is wrong ...");
         e.printStackTrace(System.err)     }

Exemple 3-2: Simple application qui affiche les éléments d'un arbre II

SAXParseException est levée quand le parseur tombe sur une erreur XML
    • notez les méthodes getLineNumber et getColumnNumber, qui sont bien utiles pour l'utilisateur !
catch (SAXParseException e) { 
	System.out.println("The File is not well formed.");
	System.out.println(e.getMessage()
		    + " at line " + e.getLineNumber() 
		    + ", column " + e.getColumnNumber());
    }
Erreurs SAX non identifiés
catch (SAXException e) { 
	System.out.println("SAX exception found");
	System.out.println(e.getMessage());
	e.printStackTrace(System.out);
    }
Si la lecture/écriture pose problème
catch (IOException e) {
	System.out.println("Beurk: IOException " + e);
    }
Tout ce qui peut encore arriver
catch (Exception e) {
	e.printStackTrace(System.out);
Note:
  • Si ne me trompes pas, il n'existe pas d'erreurs spécifiques liés au DOM parsing
  • Vous utilisez donc la même stratégie pour le SAX parsing.

3.3 Filtrage avec un simple Servlet

Exemple 3-3: Simple servlet qui affiche les éléments d'un arbre

A. getElementsbyName

Document doc = parser.getDocument();
printElements(doc.getElementsByTagName("title"));

B. Traitement d'une NodeList

......
public void printElements(NodeList listOfNodes) {
 for (int i=0; i<listOfNodes.getLength();i++) {
   Element node = (Element) listOfNodes.item(i);
   out.println("Node Name = " + node.getNodeName());
   // out.println("Node Value = " + node.getNodeValue());
   out.println("String Value= " + node.getFirstChild().getNodeValue());
  }
}
A retenir:

Rappel: La classe Element: Contains both the data for the element itself (element name and attributes), and any contained nodes, including document text (as children).

  • Donc le contenu d'un node est un sous-node !! (utiliser getFirstChild() pour ça)
  • la méthode Element getNodeValue() permet d'obtenir la valeur (contenu) d'un noeud. Pour les nodes de type Text, CDATASection, ProcessingInstruction, and Comment la valeur est un string et c'est cela qui nous intéresse ici.
  • la méthode Element getFirstChild() retourne le premier enfant.

Exemple 3-4: Simple servlet qui affiche en HTML les éléments d'un arbre

Exemple 3-5: Simple servlet qui demande (en GET) un URL et un tag

On cherche les paramètres

String  xmlURL = req.getParameter ( "url" );
String  tag = req.getParameter ( "tag" );

... et on les utilise

parser.parse(xmlURL); getElements(doc.getElementsByTagName(tag));

UP PREVIOUS NEXT -- TIE