34. DOM (Document Object Model)
34.1. DOM
DOM est l'acronyme de Document Object Model. C'est une spécification du W3C pour proposer une API qui permet de
modéliser, de parcourir et de manipuler un document XML.
Le principal rôle de DOM est de fournir une représentation mémoire d'un document XML sous la forme d'un arbre
d'objets et d'en permettre la manipulation (parcours, recherche et mise à jour)
A partir de cette représentation (le modèle), DOM propose de parcourir le document mais aussi de pouvoir le modifier.
Ce dernier aspect est l'un des aspects les plus intéressant de DOM.
DOM est fini pour être independant du langage dans lequel il sera impmen. DOM n'est qu'une scification qui
pour être utilisée doit être implémentée par un éditeur tiers.
Il existe deux versions de DOM nommées «niveau» :
DOM Core Level 1 : cette spécification contient les bases pour manipuler un document XML (document,
élément et noeud)
DOM level 2
Le level 3 est en cours de développement.
Chaque élément qui compose l'arbre possède un type. Selon ce type, l'élément peut avoir certains éléments fils comme le
montre le schéma ci dessus :
Le premier élément est le document encapsulé dans l'interface Document
Toutes les classes et interfaces sont regroupées dans le package org.w3c.dom
Développons en Java 509
34.1.1. Les interfaces du DOM
Chaque type d'entité qui compose l'arbre est défini dans une interface. L'interface de base est l'interface Node. Plusieurs
autres interfaces héritent de cette interface.
34.1.1.1. L'interface Node
Chaque élément de l'arbre est un noeud encapsulé dans l'interface org.w3c.dom.Node ou dans une de ces interfaces filles.
L'interface définit plusieurs méthodes :
Méthode Rôle
short getNodeType() Renvoie le type du noeud
String getNodeName() Renvoie le nom du noeud
String getNodeValue() Renvoie la valeur du noeud
NamedNodeList
getAttributes() Renvoie la liste des attributs ou null
void setNodeValue(String) Mettre à jour la valeur du noeud
boolean hasChildNodes() Renvoie un booleen qui indique si le noeud à au moins un noeud fils
Node getFirstChild() Renvoie le premier noeud fils du noeud ou null
Node getLastChild() Renvoie le dernier noeud fils du noeud ou null
NodeList getChildNodes() Renvoie une liste des noeuds fils du noeud ou null
Node getParentNode() Renvoie le noeud parent du noeud ou null
Node getPreviousSibling() Renvoie le noeud frère précédent
Node getNextSibling() Renvoie le noeud frère suivant
Document
getOwnerDocument() Renvoie le document dans lequel le noeud est inclus
Node insertBefore(Node,
Node) Insère le premier noeud fourni en paramètre avant le second noeud
Node replaceNode(Node,
Node) Remplace le second noeud fourni en paramètre par le premier
Node removeNode(Node) Supprime le noeud fourni en paramètre
Node appendChild(Node) Ajout le noeud fourni en paramètre aux noeuds enfants du noeud courant
Node clodeNode(boolean) Renvoie une copie du noeud. Le boolean fourni en paramètre indique si la copie doit
inclure les noeuds enfants
Tous les différents noeuds qui composent l'arbre héritent de cette interface. La méthode getNodeType() permet de
connaître le type du noeud. Le type est très important car il permet de savoir ce que contient le noeud.
Le type de noeud peut être :
Constante Valeur Rôle
ELEMENT_NODE 1 Element
ATTRIBUTE_NODE 2 Attribut
Développons en Java 510
TEXT_NODE 3
CDATA_SECTION_NODE 4
ENTITY_REFERENCE_NODE 5
ENTITY_NODE 6
PROCESSING_INSTRUCTION_NODE 7
COMMENT_NODE 8
DOCUMENT_NODE 9 Racine du document
DOCUMENT_TYPE_NODE 10
DOCUMENT_FRAGMENT_NODE 11
NOTATION_NODE 12
34.1.1.2. L'interface NodeList
Cette interface définit une liste ordonnée de noeuds suivant l'ordre du document XML. Elle définit deux méthodes :
Méthode Rôle
int getLength() Renvoie le nombre de noeuds contenus dans la liste
Node item(int) Renvoie le noeud dont l'index est fourni en paramètre
34.1.1.3. L'interface Document
Cette interface définit les caractéristiques pour un objet qui sera la racine de l'arbre DOM. Cette interface hérite de
l'interface Node.
Un objet de type Document possède toujours un type de noeud DOCUMENT_NODE.
Méthode Rôle
DocumentType getDocType() renvoie le nombre de noeuds contenu dans la liste
Element getDocumentElement() renvoie l'élément racine du document
NodeList getElementsByTagNames(String) renvoie une liste des éléments dont le nom est fourni en paramètre
Attr createAttributes(String) créé un attribut dont le nom est fourni en paramètre
CDATASection createCDATASection(String) créé un noeud de type CDATA
Comment createComment(String) créé un noeud de type commentaire
Element createElement(string) créé un noeud de type élément dont le nom est fourni en paramètre
34.1.1.4. L'interface Element
Cette interface finit des méthodes pour manipuler un élément et en particulier les attributs d'un ément. Un élement
dans un document XML correspondant à un tag. L'interface Element hérite de l'interface Node.
Un objet de type Element à toujours pour type de noeud ELEMENT_NODE
Méthode Rôle
String getAttribute(String) renvoie la valeur de l'attribut dont le nom est fourni en paramètre
Développons en Java 511
removeAttribut(String)
setAttribut(String, String) modifier ou créer un attribut dont le nom est fourni en premier paramètre et
la valeur en second
String getTagName() renvoie le nom du tag
Attr getAttributeNode(String) renvoie un objet de type Attr qui encapsule l'attribut dont le nom est fourni
en paramètre
Attr removeAttributeNode(Attr) supprime l'attribut fourni en paramètre
Attr setAttributNode(Attr) modifier ou créer un attribut
NodeList
getElementsByTagName(String)
renvoie une liste des noeuds enfants dont le nom correspond au paramètre
fourni
34.1.1.5. L'interface CharacterData
Cette interface défine des méthodes pour manipuler les données de type PCDATA d'un noeud.
Méthode Rôle
appendData() Ajouter le texte fourni en paramètre aux données courantes
getData() Renvoie les données sous la forme d'une une chaîne de caractères
setData() Permet d'initialiser les données avec la chaîne de caractères fournie en paramètre
34.1.1.6. L'interface Attr
Cette interface définit des méthodes pour manipuler les attributs d'un élement.
Les attributs ne sont pas des noeuds dans le modèle DOM. Pour pouvoir les manipuler, il faut utiliser un objet de
type Element.
Méthode Rôle
String getName() renvoie le nom de l'attribut
String getValue() renvoie la valeur de l'attribut
String setValue(String) mettre le valeur avec celle fournie en parametre
34.1.1.7. L'interface Comment
Cette interface permet de caractériser un noeud de type commentaire.
Cette interface étend simplement l'interface CharacterData. Un objet qui implémente cette interface générera un tag de la
forme <!−− −−> .
34.1.1.8. L'interface Text
Cette interface permet de caractériser un noeud de type Text. Un tel noeud représente les données d'un tag ou la valeur
d'un attribut.
Développons en Java 512
34.1.2. Obtenir un arbre DOM
Pour pouvoir utiliser un arbre DOM représentant un document, il faut utiliser un parseur qui implémente DOM. Ce
dernier va parcourir le document XML et créer l''arbre DOM correspondant. Le but est d'obtenir un objet qui implémente
l'interface Document car cet objet est le point d'entrée pour toutes opérations sur l'arbre DOM.
Avant la définition de JAXP par Sun, l'instanciation d'un parseur était spécifique à chaque à implémentation.
Exemple : utilisation de Xerces sans JAXP
package perso.jmd.tests.testdom;
import org.apache.xerces.parsers.*;
import org.w3c.dom.*;
public class TestDOM2 {
public static void main(String[] args) {
Document document = null;
DOMParser parser = null;
try {
parser = new DOMParser();
parser.parse("test.xml");
document = parser.getDocument();
} catch (Exception e) {
e.printStackTrace();
}
}
}
JAXP permet, si le parseur respecte ces spécifications, d'instancier le parseur de façon normalisée.
Exemple : utilisation de Xerces avec JAXP
package perso.jmd.tests.testdom;
import org.w3c.dom.*;
import javax.xml.parsers.*;
public class TestDOM1 {
public static void main(String[] args) {
Document document = null;
DocumentBuilderFactory factory = null;
try {
factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
document = builder.parse("test.xml");
} catch (Exception e) {
e.printStackTrace();
}
}
}
L'utilisation de JAXP est fortement recommandée.
Remarque : JAXP est détaillé dans une des sections suivantes de ce chapitre.
34.1.3. Parcours d'un arbre DOM
Développons en Java 513
1 / 271 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !