Echange de données Syntaxe du XML Java pour le XML

Transcription

Echange de données Syntaxe du XML Java pour le XML
XML
n 
Echange de données
n 
Syntaxe du XML
n 
DTD
n 
Schéma
n 
Java pour le XML
n 
Lire avec la couche SAX
n 
Lire et Ecrire avec la couche DOM
Echange de données
n 
n 
Intérêt d'une technologie pivot
Un problème double, les système qui
échangent :
n 
Doivent être d'accord sur la forme attendue pour les
données échangées
n 
n 
Format standard d'échange
Doivent aussi être d'accord sur le sens des
données échangées
n 
Modélisation et standards par métiers
Exemples de technologie
n 
Standard STEP :
n 
Norme ISO, effort international à partir du début des
années 80.
n 
n 
Normalisation de la sémantique des données échangées
par des modèles standards, les protocoles
d'application
Normalisation de la forme
n 
n 
n 
Échange de données avec le format STEP
Modélisation avec le langage EXPRESS
Normalisation de la mise en oeuvre des échanges
n 
Interface standard d'accès aux données
Exemples de technologie (2)
n 
Technologie XML
n 
n 
n 
Méta-langage à balise pour l'encodage des
données
Modélisation par les DTD ou les Schémas XML
Définition de vocabulaires spécialisés par
métier
n 
Mathématiques (MathML)
n 
Bio-informatique (BSML)
n 
Ressources Humaines (HRML)
n 
SIG (GML) ...
Philosophie d'XML
•  Structuration logique du contenu
– Les documents ne contiennent aucune information
de mise en page
– Séparation contenu-traitement adapté à l'échange
de donnée et la mise en oeuvre de systèmes
d'information
– Réutilisabilité de l’information
Format XML
n 
Langage à balise : syntaxe générique et
régulière
<A>[ information concernant A ]</A>
<B [ attributs pour B ]> </B>
n 
Un document XML contient :
n 
Un prologue
n 
n 
n 
Déclaration XML (”je suis un document XML”)
Référence éventuelle à un document qui décrit le format
Une suite d'éléments
n 
Organisation arborescente
Entête XML
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
n 
On distingue trois informations fournies dans
cette déclaration :
n 
n 
n 
version : version du XML utilisée (1.0 ou 1.1)
encoding : le jeu de codage de caractères utilisé.
ISO-8859-1 a tendance à être remplacé par
l'ISO-8859-15 en attendant la généralisation de
l'Unicode. Par défaut, l'attribut encoding a la valeur
UTF-8.
standalone : dépendance du document par rapport à une
déclaration de type de document (yes ou no)
Entête : Instruction de traitement
n 
Instruction interprétée par l'application servant à
traiter le document XML.
n 
Elle ne fait pas totalement partie du document
Feuille de style
<?xml-stylesheet type="text/xsl" href="biblio.xsl"?>
n 
n 
Dans cet exemple, l'application est xml-stylesheet,
le processeur de feuille de style du XML.
n 
Deux feuilles de style différentes peuvent être utilisées :
n 
n 
les XSL (propres au XML) ainsi que
les CSS (feuilles de style apparues avec le HTML).
Entête : Type de document
n 
n 
La structure d'un document et le modèle de
données sous-jacent peuvent être explicités
dans une DTD
Permet de définir la structure du document.
<!DOCTYPE Carnet SYSTEM "Carnet.dtd">
n  Modèle déclaré dans le fichier local ”Carnet.dtd”
n 
n 
Peut être exploité par les logiciel (browser ...) pour
contrôler les données échangées
DTD limité → remplacé par les schémas XML
Commentaires
n 
Comme en HTML
n 
Commencent par ”<!--” et se terminent par ”-->”.
n 
N'importe ou mais à l'extérieur d'une balise
n 
Exemples :
n 
<!-- ok boy -->
n 
<Contact> <!-- ok boy--> ... </Contact>
n 
”--” interdite dans un commentaire.
Éléments XML
n 
n 
Un élément est une unité d'information avec :
n 
Une balise
n 
Éventuellement avec un contenu
n 
Éventuellement avec un ou plusieurs attributs
Un document XML est un arbre
n 
Une seule racine
n 
Un élément réprésente un noeud
Éléments XML
n 
Exemple : arbre du carnet d'adresses
<Carnet>
<Type>Activite professionnelle</Type>
<Contact>
<Nom>Albert and co</Nom>
<Telephone>0798029856</Telephone>
</Contact>
</Carnet>
ou avec des attributs
<Carnet type=”Activite professionnelle”>
<Contact nom=”Albert and co” Telephone=”0798029856”/>
</Carnet>
Règles de construction
n 
Nom de balise quasiment libre
n 
n 
n 
Le 1er caractère doit être une lettre, un '_' ou un ':'
Ne peut pas commencer par ”xml” (quelque-soit la
casse)
Le contenu peut être :
n 
Vide (<carnet></carnet> abbrégé en <carnet/>)
n 
Un ou plusieurs autres éléments
n 
Un texte libre
Attributs
n 
n 
n 
n 
n 
Des attributs peuvent être utilisés pour stocker
de l'information
Un attribut est un nom associé à une
information
L'information est alors uniquement textuelle
Ils ne peuvent pas être emboités (un seul
niveau)
Il est plutôt préconisé d'utiliser des éléments car
plus souples (document plus évolutif)
Syntaxe
n 
Quelques règles très simples
n 
n 
n 
n 
n 
Une seul élément racine
Chaque élément contient
n  une balise d'ouverture <B>
n  une balise de fermeture correspondante </B>
Les balises ne peuvent pas se chevaucher
<auteur><nom></auteur></nom>
Les attributs à l'intérieur d'un élément ont des noms uniques
Les noms d'éléments et de balises doivent être autorisés
Exercice 1
n 
Reprendre le modèle du carnet et l'enrichir :
n 
n 
On a plusieurs types de carnets définit par
l'application
Un contact a des informations standards :
n 
n 
Un contact peut avoir des informations
suplémentaires définies par l'utilisateur
n 
n 
Nom, prénom, des adresses et des téléphones, photo...
Par exemple, ”Plat préféré”, ”Hobby” ....
Produire des fonctions pour initialiser un carnet
et pour produire un export XML complet et
valide
Type de document
n 
n 
n 
Utile pour contrôler le contenu d'un fichier XML
n 
Vérification par les applications
n 
Partage ou échange de documents
n 
Standards métiers
Deux solutions possibles :
n 
les "Schémas XML" et
n 
les "Document Type Definition" (DTD)
DTD : plus ancien, plus simple mais plus limité.
Type de DTD
n 
Forme générale :
<!DOCTYPE Carnet ... "..." "...">
n 
n 
n 
Placée juste après le prologue
Indique l'élément racine du document (ici ”Carnet”)
Deux types suivant le type de stockage :
n 
Une DTD interne est intégrée au document XML
n 
Une DTD externe est dans un fichier séparé
n 
Externe privé (fichier local uniquement)
n 
Externe publique (fichier accessible en public sur le web)
DTD interne
<!DOCTYPE Carnet[
<!ELEMENT Carnet (Contact)*> ...
]>
n 
n 
n 
L'élément racine est ”Carnet”
Les règles sont donnée dans la suite entre ”[” et
”]”
Ici, un carnet se compose de zéro ou plusieurs
contacts
DTD externe
n 
DTD locale
<!DOCTYPE Carnet SYSTEM "carnet.dtd">
n 
n 
Stockée dans le fichier "carnet.dtd"
DTD publique
n 
n 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0
Strict//EN" "
http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
PUBLIC suivi de l'identifiant de la DTD, du
propriétaire(ici le W3C), puis son nom, enfin sa
langue.
Déclaration d'élément
n 
Forme générale :
<!ELEMENT nom type_element>
n 
Nom : nom de l'élément
n 
type_element type associé.
n 
n 
n 
n 
type texte,
vide,
séquence,
choix d'élément
Type simple : texte ou vide
n 
Type texte
<!ELEMENT nom (#PCDATA)>
exemple :
<nom>The clash</nom>
n 
Type vide
<!ELEMENT collected EMPTY>
exemples:
<collected/>
<collected date=”22/01/1964”>
Séquences
n 
Séquence : spécifie les fils d'un noeud
<!ELEMENT A (B, C, D)>
n 
n 
un élément de type A contient dans l'ordre, un B, un
C et un D
Exemple
<A>
<B>...</B>
<C>...</C>
<D>...</D>
</A>
Choix déléments
n 
Spécifie les fils possibles
n 
Un seul choix parmi la liste
<!ELEMENT A (B | C | D)>
n 
n 
un élément de type A contient dansun B, un C ou
un D
Exemple
<A>
<B>...</B>
</A>
Indication d'occurences
n 
On dispose des cardinalités :
n 
Pas d'indication : une et une seule occurences
obligatoirement
? : zéro ou une occurences
n 
+ : une ou plusieurs occurences
n 
* : zéro à plusieurs occurences
n 
<!ELEMENT A (B, C?, D+, E*)>
A contient, dans l'ordre, un B, éventuellement un C, au
moins un D et éventuellement plusieurs E
Indication d'occurences (2)
n 
Les cardinalités peuvent s'appliquer à des
regroupements
<!ELEMENT A (B, C)+>
Un A contient au moins une séquence B,C,D,E.
Exemple
<A>
<B/><C/>
<B/><C/>
<B/><C/>
<A/>
Élément quelconque
n 
Il est possible de relacher tout contrôle en
utilisant le type d'élément quelconque.
<!ELEMENT A ANY>
A peut contenir n'importe quel élément de la DTD
n 
À limiter ou a n'utiliser que pendant la mise au
point car on perd l'intérêt de la DTD
Contenu mixte
n 
Pour un modèle assez libre dans lequel du
texte peut être inséré au même niveau que des
noeuds fils
<!ELEMENT Dicton (#PCDATA | Origine)*>
un élément dicton peut contenir n'importe quelle
combinaison de texte et de noeud Origine
exemple :
<Dicton>
Après la pluie vient le beau temps
<Origine>pays ou il pleut</Origine>
</Dicton>
Type d'attribut
n 
On peut aussi contrôler les attributs avec
ATTLIST
<!ATTLIST A
nom_attribut1 type_attribut type_valeur
nom_attribut2 type_attribut type_valeur
>
A est le nom de l'élément
nom_attribut celui d'un attribut de A
Type d'attribut
n 
CDATA : chaîne de caractères
n 
ID : identifiant unique
n 
IDREF : référence à un ID
n 
IDREFS : série de références
n 
(a | b | c) : énumération de toutes les valeurs
possibles
Type de valeur
n 
REQUIRED : attribut obligatoire
n 
IMPLIED : attribut optionnel
n 
FIXED ”valeur” : valeur fixe
n 
”valeur” : valeur par défaut
Exemples d'attributs
<!ELEMENT elt (...)>
<!ATTLIST elt X CDATA "Yoyo">
L'élément elt peut avoir l'attribut X, chaine de caractères
avec ”Yoyo” comme valeur par défaut
<!ELEMENT elt (...)>
<!ATTLIST elt X CDATA #REQUIRED>
Là, X est obligatoire, pas de valeur par défaut donc
<!ELEMENT elt (...)>
<!ATTLIST elt X CDATA #IMPLIED>
Et là, X peut ne pas être présent
Exemples d'attributs (2)
<!ELEMENT elt (...)>
<!ATTLIST elt X ID #IMPLIED>
X est un identifiant obligatoire. Deux éléments ne peuvent pas
avoir la même valeur pour X
<elt X=”AAAA”/>
<elt X=”ZZ”/>
<elt X=”AAAA”/> ← interdit dans le même fichier !!
<!ELEMENT elt EMPTY>
<!ATTLIST elt X (a | b | c) "a">
l'attribut X peut prendre comme valeur: ”a”, ”b” ou ”c”.
”a” est la valeur par défaut
Les entités
n 
n 
n 
Les entités permettent d'utiliser des raccourcis
pour des valeurs
Utile pour les caractères bizarres non
directement accessible dans le jeu de
caractères déclaré (accents ...)
Plusieurs sortes d'entités :
n 
Paramétriques, de caractère et les internes
Les entités (2)
n 
Les entités paramétriques
n 
S'apparente à une macro de DTD
n 
Exemple de la DTD du HTML
<!ENTITY %heading "H1|H2|H3|H4|H5|H6">
Toute occurence de %heading; est remplacé par H1|H2|H3|
H4|H5|H6 dans la DTD.
Les entités (3)
n 
Les entités de caractères
n 
n 
sont utilisables pour représenter des caractères non
disponibles au clavier ou dans l'encodage choisi :
Exemples de la DTD de HTML:
<!ENTITY eacute "&#233;">
On peut utiliser &eacute pour avoir le ”é”
Les entités (4)
n 
Entités internes
<!ENTITY antic "anticonstitutionnellement">
On utilise &antic dans le document à la place de
anticonstitutionnellement
Exercice 2
n 
Produisez la DTD pour le TP ”Roger bricoloto”
http://cassoulet.univ-brest.fr/idm/index.php/Roger_Bricoloto
n 
n 
n 
Prendre la correction et ajouter deux exports
XML
n 
Un premier export sans attribut (version 1)
n 
Un second avec des attributs (version 2)
Produisez des exemples de fichier XML et
vérifiez votre DTD avec xmllint
Utiliser l'API java DOM pour convertir la version
1 vers la version 2 puis faites l'inverse
Espace de nommage
n 
Problème :
n 
n 
n 
conflit de nom possible: un nom peut avoir plusieurs
sens
Plusieurs éléments avec la même balise mais
plusieurs structures différentes (par exemple, un
sans sous-élément et l’autre avec des souséléments)
Il faut donc pouvoir expliciter la provenance
d’un nom
Espace de nommage
n 
n 
n 
Pour régler le problème, on utilise les espaces
de nommage.
Un espace de nommage correspond à un
regroupement arbitraire et cohérent d'éléments
Utilisé pour bien limiter et identifier le
vocabulaire dans un domaine particulier :
n 
orientation métier de XML
Espace de nommage : préfixage
n 
n 
Introduction du préfixage
n 
Pour la déclaration
n 
Pour l'utilisation ou la référence
Préfixe/suffixe :
n 
n 
Séparés par ':'
<prefixe>:<suffixe>
Exemple
<crn:carnet xmlns:crn=http://dossen.univ-brest.fr>
<crn:contact crn:nom=“bibi” crn:tel=“06060606”/>
<crn:contact crn:nom=“zorro” crn:tel=“07068609”/>
<crn:contact crn:nom=“bob” crn:tel=“08765435”/>
</crn:carnet>
“crn” est le préfixe de l’espace de nommage
Espace de nommage:
identification
Un espace de noms est identifié par une URI
Exemple:
<crn:carnet xmlns:crn=http://dossen.univ-brest.fr>
Espace de nommage :
Déclaration
n 
A l’aide du préfixe d’attribut « xmlns »
Le suffixe de cet attribut indique l’espace de
nommage
La valeur de l’attribut est l’URI qui identifie l’espace
de nommage
n 
n 
<crn:carnet xmlns:crn=http://dossen.univ-brest.fr>
crn:contact …
<
Portée d’une déclaration
•  C’est l'élément dans lequel est introduit la
déclaration
•  Cet élément est inclu dans la portée
<crn:carnet xmlns:crn=http://dossen.univ-brest.fr>
<crn:contact crn:nom=“bibi” crn:tel=“06060606”/>
</crn:carnet>
Le XML et Java
n 
JAXP (Java API for XML Processing)
n 
4 packages :
n 
n 
n 
n 
javax.xml.parsers : Interfaces devant être
implémentées par les différents parseurs (SAX ou
DOM) + les factory pour l'instanciation de parseurs.
org.w3c.dom : Classes et interfaces pour DOM
org.xml.sax : Classes et interfaces pour SAX.
javax.xml.transform : Classes et interfaces pour
XSLT (transformations).
Interface SAX
n 
Interface de gestion XML évènementiel avec
principalement
n 
n 
n 
n 
n 
Gestion du contenu : (ContentHandler) boucle de
lecture pour manipulation du contenu
Gestion d'erreurs (ErrorHandler) 3 types possibles :
erreurs simples, erreurs fatales et warnings.
Gestion du typage (DTDHandler)
Pour simplifier le codage : version par defaut
avec la classe DefaultHandler (package
org.xml.sax.helpers)
Il suffit de programmer une sous-classe
Exemple SAX
Exemple de lecture sans aucune action de branchée
try {
SAXParserFactory factory = SAXParserFactory.newInstance(); // Une
fabrique
SAXParser parser = factory.newSAXParser(); // Un parseur SAX
File file = new File("/home/plantec/COURS/XML/ExempleSax.xml");
DefaultHandler gestionnaire = new DefaultHandler(); // un gestionaire SAX
parser.parse(file, gestionnaire); // Lecture du fichier
} catch (ParserConfigurationException pce) {
} catch (SAXException se) {
} catch (IOException ioe) {
}
Interface
org.xml.sax.ContentHandler (1)
n 
Mise en oeuvre de la lecture d'un flux XML
n 
n 
n 
DefaultHandler est un exemple de classe qui l'implémente
Principe très simple de lecture dirigée par le
contenu (principe ”Framework”)
Les évenements sont liés au contenus XML
rencontrés, principalement :
n 
Début/fin de document
n 
Début/fin d'un élément
Interface
org.xml.sax.ContentHandler (2)
void startDocument();
n 
n 
Appelée une et une seule fois en début de
document
Point d'entrée pour initialiser le contexte global de
lecture
void endDocument();
n 
n 
Appelée à la fin de la lecture du document.
Point d'entrée pour finir le traitement (mise en place
finale de la représentation mémoire par exemple)
Interface
org.xml.sax.ContentHandler (3)
void startElement (String namespaceUri, String
localName, String rawName, Attributs attributs);
n 
n 
nameSpaceUri : URI complète de l'espace de
nommage du tag courant ou une chaîne vide
n 
localName : nom du tag sans le préfixe éventuel
n 
rawName : nom du tag complet (avec préfixe)
n 
attributs : contient la liste des attributs du tag
Appelée à chaque début d'élément
Interface
org.xml.sax.ContentHandler (4)
void endElement(String nameSpaceURI, String
localName, String rawName)
n 
n 
nameSpaceUri : URI complète de l'espace de
nommage du tag courant ou une chaîne vide
n 
localName : nom du tag sans le préfixe éventuel
n 
rawName : nom du tag complet (avec préfixe)
Appelée à chaque fin d'élément
Interface
org.xml.sax.ContentHandler (4)
void characters(char[] ch, int start, int end);
n 
n 
n 
ch : buffer de caractères
n 
start et end : position de début et de fin dans ch
Appelée à chaque fois qu'un contenu est lu
entre deux balises
On peut directement construire un String :
String s = new String(ch, start, end);
Interface
org.xml.sax.ContentHandler (5)
Traitement des attributs :
n 
attributs gère 2 listes de String, pour le nom et la
valeur des attributs
public void startElement(String nameSpaceURI, String localName, String
rawName, Attributes attributs) throws SAXException {
for (int index = 0; index < attributs.getLength(); index++) {
System.out.print( attributs.getLocalName (index) + " = ");
System.out.println( attributs.getValue (index));
}
}
Exemple du Carnet (1)
public class CarnetHandler extends
DefaultHandler{
Carnet carnet;
boolean dansTypeCarnet = false, dansContact ...
public void startDocument() throws SAXException {
carnet = new Carnet();
}
public void endDocument() throws SAXException {
System.out.println(”done”);
}
Exemple du Carnet (2)
public void startElement(String nameSpaceURI, String localName,
String rawName, Attributes attributs) throws SAXException {
if (localName.equals(”TypeCarnet”)) {
dansTypeCarnet = true;
} ...
}
public void characters(char[] ch, int start, int end) throws
SAXException {
if (dansTypeCarnet) {
carnet.setType(new String(ch,start,end));
} ...
Exemple du Carnet (3)
try {
SAXParserFactory factory =
SAXParserFactory.newInstance();
factory.setNamespaceAware(true);
SAXParser parser = factory.newSAXParser();
File file = new File("carnet.xml");
DefaultHandler handler = new CarnetHandler();
parser.parse(file, handler);
} catch (ParserConfigurationException pce) {
} ...
Exercice 3
n 
n 
Reprendre l'exercice 3 et utiliser l'API SAX pour
convertir la version 1 du fichier xml (sans
attribut) vers la version 2 (avec attributs) puis
faites l'inverse
Mettre en place la gestion des ID/IDREF
Ajouter dans la classe societe une liste de réparations en
contentieux (se sont des idref).
Générer le document XML avec un ID unique pour chaque
entité et les IDREF
n 
Mettre en oeuvre la lecture SAX avec la résolution des
IDREF
Problèmes liés a SAX
n 
n 
L'API SAX est simple et puissante pour la
lecture et l'interprétation d'un flux en continu
Un analyseur SAX est délicat à développer:
n 
Gestion lourde des états de l'automate
n 
Cohérence de l'automate difficile à valider
n 
Traitement élément par élément
n 
n 
La gestion d'un modèle peut nécessiter une vue globale
des données
Besoin de stockage intermédiares
Document Object Model (DOM)
n 
n 
Modèle générique d'un document XML
API DOM : manipulation d'un document (arbre
d'éléments) tout en mémoire
n 
n 
n 
On dispose de tous les noeuds en mémoire
Navigation, requètes, traitements ou
transformations programmables directement sur
l'arbre
API java standard
DOM : lecture d'un document
n 
Interface Document : porte la racine du document
XML en mémoire
DocumentBuilderFactory factory =
DocumentBuilderFactory.newInstance();
DocumentBuilder builder = fabrique.newDocumentBuilder();
File xml = new File("Carnet.xml");
Document document = builder.parse(xml);
Interfaces DOM
n 
Node
n 
Unité de base de l'arbre
n 
suivant sont type, il s'agit :
n 
n 
n 
De texte, d'un élément ou d'une portion CDATA ...
Pour connaître son type: getNodeType()
Element
n 
constitué d'un tag, d'attributs
n 
et d'un contenu (ses éléments fils)
Interface Node
•  Interface commune à tous les objets DOM.
•  Un node permet de lire/écrire toutes les
propriétés génériques
•  Mets en oeuvre les fonctions de navigation
génériques
Interface Node
package org.w3c.dom;
public interface Node {
public static final short ELEMENT_NODE = 1 ;
public static final short ATTRIBUTE_NODE =2;
public static final short TEXT_NODE = 3;
public static final short CDATA_SECTION_NODE = 4;
public static final short ENTITY_REFERENCE_NODE = 5;
public static final short ENTITY_NODE = 6;
public static final short PROCESSING_INSTRUCTION_ NODE = 7;
public static final short COMMENT_NODE = 8;
public static final short DOCUMENT_NODE = 9
public static final short DOCUMENT_TYPE_NODE = 10;
public static final short DOCUMENT_FRAGMENT_NODE = 11;
public static final short NOTATION_NODE = 12;
…
Interface Node
…
public String getNodeName();
Retourne le nom du Node.
• 
Pour un Element ou un Node Attribute, retourne le nom qualifié (Qname)
• 
Pour un Node Document, “#document”.
• 
Pour un Node Comment “#comment”.
• 
Pour un Node Text “#text”.
Etc…
Interface Node
…
public String getNodeValue();
public void setNodeValue(String nodeValue)
• 
Retourne/modifie la valeur (texte) du Node.
• 
Pour Attribute, CDATA, et Comment la valeur est le texte du Node
• 
Pour les autres type de Node, retourne null ou sans effet.
public short getNodeType();
•  Retourne le type du Node
public Node getParentNode();
•  Retourne le Node parent
Interface Node
NodeList getChildNodes()
• 
Retourne les noeuds enfants.
Node getFirstChild()
• 
Retourne le premier Node enfant.
Node getLastChild()
• 
Retourne le dernier Node enfant.
Node getNextSibling()
• 
Retourne le frère suivant
Node GetPreviousSibling()
• 
Retourne le frère précédent
public Document getOwnerDocument();
• 
Retourne le Document du Node
Interface Node
public Node insertBefore(Node newChild, Node refChild);
public Node replaceChild(Node newChild, Node oldChild);
public Node removeChild(Node oldChild);
public Node appendChild(Node newChild);
•  Méthodes pour ajouter/remplacer/supprimer un Node enfant
public boolean hasChildNodes();
•  Le Node est-il une feuille ?
public Node cloneNode(boolean deep);
•  Cloner en profondeur ou non
Interface Node
public String getNamespaceURI();
public String getPrefix();
public void setPrefix(String prefix);
public String getLocalName();
•  Méthodes relatives à l’espace de nommage
public boolean hasAttributes();
•  Est-ce que le Node a des attributs ?
Naviguer dans un arbre
Void naviguerProfondeurDabord( Node n ) {
// Traitement avec le Node n
// Traiter récursivement le premier fils
Node p = n.getFirstChild();
if ( p != null ) naviguerProfondeurDabord( p );
// Traiter récursivement le frère suivant
p = n.getNextSibling();
if ( p != null ) naviguerProfondeurDabord( p ); }
}
Interface NodeList
package org.w3c.dom;
public interface NodeList {
public Node item(int index);
public int getLength();
}
void naviguerProfondeurDabord ( Node n ) {
NodeList nl = n.getChildNodes();
for(int i=0;i<nl.getLength();i++) {
naviguerProfondeurDabord ( nl.item ( i ));
}}
Interface Element
n 
Pour manipuler les éléments XML
n 
Node avec une balise,
n 
Eventuellement avec des attributs et
n 
Éventuellement avec des Elements fils
Interface Element
public String getTagName();
• 
• 
Retourne la propriété “nodeName” de l’élément.
Si le document contient un espace de nommage alors le résultat dépend de
la mise en oeuvre …
public String getAttribute(String name);
public void setAttribute(String name, String value);
public void removeAttribute(String name);
public boolean hasAttribute(String name);
public boolean hasAttributeNS(String namespaceURI, String localName);
• 
Retrouver/ajouter/modifier/supprimer un attribut
Interface Element
public Attr getAttributeNode(String name);
public Attr setAttributeNode(Attr newAttr);
public Attr removeAttributeNode(Attr oldAttr;
•  Retrouver/ajouter/modifier/supprimer un attribut
mais cette fois avec un Objet de type Attr
Interface Element
On peut retrouver les éléments fils
NodeList getElementsByTagName(String t) :
n 
les éléments enfants dont le tag correspond à t (*
pour renvoyer tous les éléments).
NodeList getElementsByTagNameNS(String t) :
n 
idem mais avec en plus prise en compte de
l'espace de nommage
String getTextContent() :
n 
Le texte contenu dans un élément
Interface Attr
package org.w3c.dom;
public interface Attr extends Node {
public String getName();
public String getValue();
public void setValue(String value);
public Element getOwnerElement();
}
Interface Document
•  Représente la racine d’un arbre DOM.
•  Mise en oeuvre comme une Factory pour créer
les autres types de Node
Interface Document
public interface Document extends Node {
public DocumentType getDoctype();
public DOMImplementation getImplementation();
public Element getDocumentElement();
public Element createElement(String tagName);
public Text createTextNode(String data);
public Comment createComment(String data);
public CDATASection createCDATASection(String
data);
…
Interface Document
…
public Attr createAttribute(String name);
public NodeList getElementsByTagName(String tagname);
public Element createElementNS(String URI, String qualName);
public Attr createAttributeNS(String URI, String qualName);
public NodeList getElementsByTagNameNS(String URI, String
localName);
}
Interface Document
NodeList addElementAndGetList ( Document doc ) {
Element docelt = doc.getDocumentElement();
Element e = doc.createElement ( "employee" );
docelt.appendChild ( e );
Attr a = doc.createAttribute ( "id" );
Text t = doc.createTextNode ( "5" );
a.appendChild ( t );
e.setAttributeNodeNS ( a );
return doc.getElementsByTagName ( "employee" );
}
DOMImplementation
•  C’est avec un DOMImplementation que l’on
crée le Document initial
public interface DOMImplementation {
public boolean hasFeature(String feature, String version);
public DocumentType createDocumentType(String
qualifiedName, String publicId, String systemId);
public Document createDocument(String namespaceURI, String
qualifiedName, DocumentType doctype);
}
Création , modification d'un arbre
DocumentBuilderFactory dbf =
DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
DOMImplementation domImpl = db.getDOMImplementation();
Document document = domImpl.createDocument(
"urn:example.namespace",
"my:example",
null);
Element element = document.createElementNS(
"http://another.namespace",
"element");
document.getDocumentElement().appendChild(element);
...
Création , modification d'un arbre
n 
n 
n 
On peut créer un arbre de toute pièce
directement par programme,
On peut aussi modifier, déplacer, supprimer
des éléments
...
→ Se reporter à la documentation Oracle et aux
exemples sur internet
Ecrire un fichier XML avec un
DOMSource et un Transformer
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
Document doc = docBuilder.newDocument();
doc.getDocumentElement().appendChild(doc.createElement("company”));
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
DOMSource source = new DOMSource(doc);
// Ecrire dans un fichier
StreamResult f = new StreamResult(new File("C:\\company.xml"));
transformer.transform(source, f);
// Ecrire sur la sortie standard
StreamResult c = new StreamResult(System.out);
transformer.transform(source, c);
Exercice 4
n 
Lire et créer un document XML Bricoloto avec DOM,
version avec attributs et avec un visiteur
n 
n 
n 
Le visiteur ne construit pas directement un String mais
renvoie un Document
Le Document est ensuite utilisé pour produire le String
Utilisez un JTree (javax.swing) pour la visualisation
d'un document
1. 
Visu brute : sans se préoccuper du type de Node
2. 
Visu classique : présentation « propre » des éléments

Documents pareils