L'API DOM : Document Object Model



Documents pareils
DOM - Document Object Model

Document Object Model (DOM)

NFA016 : Introduction. Pour naviguer sur le Web, il faut : Naviguer: dialoguer avec un serveur web

Langage HTML (2 partie) <HyperText Markup Language> <tv>lt La Salle Avignon BTS IRIS</tv>

Master d Informatique Corrigé du partiel novembre 2010

TP JAVASCRIPT OMI4 TP5 SRC

Serveur d'application Client HTML/JS. Apache Thrift Bootcamp

HTML, CSS, JS et CGI. Elanore Elessar Dimar

Programmation Web. Madalina Croitoru IUT Montpellier

Avantages et méthode de la bonne gouvernance d'entreprise - le cas pratique des PSF

Mise à jour : janvier 2015 POURQUOI ET COMMENT OPTIMISER LES VISUELS

Programmation Internet Cours 4

STID 2ème année : TP Web/PHP

XML par la pratique Bases indispensables, concepts et cas pratiques (3ième édition)

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Production de documents avec XSLT. Production de documents p.1/??

Outils logiciels pour l'ingénierie documentaire

CRÉER, ROUTER ET GÉRER UNE NEWSLETTER, UN ING

Séance d ED n 5 : HTML et JavaScript

Le Portfolio d une... Marion Bossaton. #Curieuse #Créative #Connectée

Faculté de Génie Chaire industrielle en infrastructures de communication. La technologie XML. Wajdi Elleuch

Module BD et sites WEB

Démonstration de la mise en cache via HTML 5 sur iphone

Programmation des Applications Réparties. Parsers XML DOM et SAX

Module Com231A - Web et Bases de Données Notion 5 : Formulaires et utilisation des Bases de Données avec PHP

4. SERVICES WEB REST 46

Les sites Internet dynamiques. contact : Patrick VINCENT pvincent@erasme.org

HTML. Notions générales

TP JEE Développement Web en Java. Dans ce TP nous commencerons la programmation JEE par le premier niveau d une application JEE : l application web.

Tour d horizon des CMS. Content Management System

ATHOMEMAGAZINE. Les prix de l immobilier au Luxembourg!

Introduction. PHP = Personal Home Pages ou PHP Hypertext Preprocessor. Langage de script interprété (non compilé)

Failles XSS : Principes, Catégories Démonstrations, Contre mesures

PLUGINS Guide du Développeur STEPHANE FERRARI. P l u X m l 5.4

Classe ClInfoCGI. Fonctions membres principales. Gestion des erreurs

1 / Introduction. 2 / Gestion des comptes cpanel. Guide débuter avec WHM. 2.1Créer un package. 2.2Créer un compte cpanel

RAPPORT AUDIT SEO. Élaboré à l'attention de : Monsieur Greber Élaboré par : Cédric Peinado

INTERNET est un RESEAU D ORDINATEURS RELIES ENTRE EUX A L ECHELLE PLANETAIRE. Internet : interconnexion de réseaux (anglais : net = réseau)

COMPRENDRE L ARCHITECTURE DES WEB SERVICES REST. Amosse EDOUARD, Doctorant

Panel des technologies Web

Documentation CAS à destination des éditeurs

Internet. DNS World Wide Web. Divers. Mécanismes de base Exécution d'applications sur le web. Proxy, fire-wall

Formation Webmaster : Création de site Web Initiation + Approfondissement

Aspects techniques : guide d interfaçage SSO

Introduction aux concepts d ez Publish

HTML/CSS - Travaux Pratiques 2

Formulaire pour envoyer un mail

SHERLOCK 7. Version du 01/09/09 JAVASCRIPT 1.5

Le stockage local de données en HTML5

TP 5 Les CMS, la forme et le fond Internet et Outils (IO2)

Formation : WEbMaster

TP1 : Initiation à Java et Eclipse

Informatique : Création de site Web Master 2 ANI TP 1

Stockage du fichier dans une table mysql:

Soon_AdvancedCache. Module Magento SOON. Rédacteur. Relecture & validation technique. Historique des révisions

Générer du code à partir d une description de haut niveau

Devenez un véritable développeur web en 3 mois!

1. Installation du Module

Plateforme publicitaire Entreprendre. Guide de normes

Dynamisez vos sites web avec Javascript!

Tous les autres noms de produits ou appellations sont des marques déposées ou des noms commerciaux appartenant à leurs propriétaires respectifs.

Modélisation PHP Orientée Objet pour les Projets Modèle MVC (Modèle Vue Contrôleur) Mini Framework

< _155_0>

Auteur LARDOUX Guillaume Contact Année 2014 DEVELOPPEMENT MOBILE AVEC CORDOVA

PHP 5.4 Développez un site web dynamique et interactif

Java Licence Professionnelle Cours 7 : Classes et méthodes abstraites

Alfstore workflow framework Spécification technique

«Cachez-moi cette page!»

BASE DE DONNÉES XML NATIVE

Architecture Orientée Service, JSON et API REST

Hébergement de site web Damien Nouvel

TD Objets distribués n 3 : Windows XP et Visual Studio.NET. Introduction à.net Remoting

Les services usuels de l Internet

Petite définition : Présentation :

Livre Blanc WebSphere Transcoding Publisher

Développement des Systèmes d Information

Logiciels de référencement

FileMaker Server 11. Publication Web personnalisée avec XML et XSLT

Magento. Magento. Réussir son site e-commerce. Réussir son site e-commerce BLANCHARD. Préface de Sébastien L e p e r s

Installation d un serveur HTTP (Hypertext Transfer Protocol) sous Débian 6

Initiation à html et à la création d'un site web

Qui sommes-nous? Buddyweb est une agence digitale spécialisée dans les projets web et mobiles.

Généralités sur le Langage Java et éléments syntaxiques.

Création d objet imbriqué sous PowerShell.

1 ère Université WEB. Courbevoie Samedi 21 octobre Votre site interactif sur internet.

Les outils de création de sites web

Programme «Analyste Programmeur» Diplôme d état : «Développeur Informatique» Homologué au niveau III (Bac+2) (JO N 176 du 1 août 2003) (34 semaines)

TP1 : Initiation à Java et Eclipse

Architectures Web Services RESTful

Thierry BOULANGER. par la pratique. Bases indispensables Concepts et cas pratiques XML. 3 ième édition. Nouvelle édition

Gestion du cache dans les applications ASP.NET

BIRT (Business Intelligence and Reporting Tools)

Présentation du langage et premières fonctions

Banque de données d offres & carte web interactive d offres

Notes pour l utilisation d Expression Web

Attaques de type. Brandon Petty

Cahier Technique. «Développer une application intranet pour la gestion des stages des étudiants» Antonin AILLET. Remi DEVES

Transcription:

Ingénierie Documentaire L'API DOM : Document Object Model http://doc.crzt.fr STÉPHANE CROZAT 16 octobre 2014

Table des matières I - Introduction au DOM 5 A. Principes du DOM...5 B. L'interface DOM...6 II - Implémentation JavaScript du DOM 9 A. Introduction à JavaScript...9 B. Fonctions et objets DOM en JavaScript...10 C. Spécificités HTML...11 III - Fonctions et objets JavaScript liés à XML 13 A. Utiliser XPath...13 B. Exécuter une XSLT...14 C. xmlhttprequest : Communication avec le serveur...14 D. XMLSerializer : Sérialiser un DOM...16 IV - Exercices 17 A. Travaux pratiques DOM et JavaScript...17 1. "Hello World!" en JavaScript...17 2. Manipulation du DOM en JavaScript...17 3. Un éditeur XML en JavaScript...19 Solution des exercices 23 Bibliographie 27 Contenus annexes 29 3

Introduction au I - DOM I Principes du DOM 5 L'interface DOM 6 A. Principes du DOM Définition Le DOM ( Document Object Model) est un standard W3C qui décrit une API orientée objet permettant de représenter un document XML ou HTML en mémoire afin de la manipuler avec un langage de programmation. Le standard DOM est indépendant d'un langage de programmation en particulier, et implémenté dans de nombreux langages (JavaScript, Java, PHP, C,...). «The Document Object Model is a platform- and language-neutral interface that will allow programs and scripts to dynamically access and update the content, structure and style of documents.» http://www.w3.org/dom/ 1 Fonctions du DOM L'API DOM permet de : Exemple Parcourir un arbre XML ou HTML Rechercher des nœuds particuliers, en consulter le contenu Créer, ajouter, supprimer, déplacer des nœuds dans l'arbre L'API DOM implémentée en JavaScript permet de manipuler un document HTML ou XHTML, afin d'en modifier dynamiquement (en fonction des actions utilisateurs), la structure et le contenu :... Faire apparaître ou disparaître des éléments div en fonction d'une action utilisateur Créer ou initialiser des contrôles de formulaire 1 - http://www.w3.org/dom/ 1 function fdisplay(pdivid) { 2 var vdiv = document.getelementbyid(pdivid); 5

Introduction au DOM Introduction au DOM 3 vdiv.style.display="block"; 4 } Rappel L'arbre du document XML - p.29 B. L'interface DOM Fondamental Document Object Model (DOM) Technical Reports http://www.w3.org/dom/domtr 2 Document Object Model Core http://www.w3.org/tr/2004/rec-dom-level-3-core-20040407/core.html 3 Objets principaux Node : Élément central du DOM, il représente tout nœud de l'arbre DOM, les autres interfaces en héritent. NodeList : Ensemble ordonné de Nodes. Document : Racine d'un fichier XML bien formé (ou d'un fichier HTML valide), son fils est donc l'élément racine du document XML. Element : Représentation d'un élément au sens XML Attr : Représentation d'un attribut au sens XML Text : Contenu textuel d'un nœud texte ou d'un attribut au sens XML http://www.w3.org/tr/2004/rec-dom-level-3-core-20040407/core.html#id- 1590626201 4 Attributs principaux de Node string nodename integer nodetype Node parentnode NodeList childnodes Node firstchild http://www.w3.org/tr/2004/rec-dom-level-3-core-20040407/core.html#id- 1950641247 5 Attributs principaux de NodeList Node item(integer index) integer length Fonctions principales de Node Node insertbefore(node newchild, Node refchild) Node replacechild(node newchild, Node oldchild) 2 - http://www.w3.org/dom/domtr 3 - http://www.w3.org/tr/2004/rec-dom-level-3-core-20040407/core.html 4 - http://www.w3.org/tr/2004/rec-dom-level-3-core-20040407/core.html#id-1590626201 5 - http://www.w3.org/tr/2004/rec-dom-level-3-core-20040407/core.html#id-1950641247 6 6

Introduction au DOM Node removechild(node oldchild) Node appendchild(node newchild) boolean haschildnodes() Node clonenode(boolean deep) http://www.w3.org/tr/2004/rec-dom-level-3-core-20040407/core.html#id- 1950641247 6 Fonctions principales de Document Element getelementbyid(string elementid) NodeList getelementsbytagname(string tagname) Element createelement(string tagname) Text createtextnode(string data) Attr createattribute(string name) http://www.w3.org/tr/2004/rec-dom-level-3-core-20040407/core.html#i- Document 7 Fonctions principales de Element NodeList getelementsbytagname(string name) Attr getattributenode(string name) Attr setattributenode(attr newattr) Attr removeattributenode(attr oldattr) boolean hasattribute(string name) http://www.w3.org/tr/2004/rec-dom-level-3-core-20040407/core.html#id- 745549614 8 Text (attributs et fonctions) Attributs : string data integer length Fonctions : void appenddata(string arg) void insertdata(integer offset, string arg) void deletedata(integer offset, integer count) void replacedata(integer offset, integer count, string arg) http://www.w3.org/tr/2004/rec-dom-level-3-core-20040407/core.html#id- 1312295772 9 Attr (attributs) string name string value http://www.w3.org/tr/2004/rec-dom-level-3-core-20040407/core.html#id- 637646024 10 6 - http://www.w3.org/tr/2004/rec-dom-level-3-core-20040407/core.html#id-1950641247 7 - http://www.w3.org/tr/2004/rec-dom-level-3-core-20040407/core.html#i-document 8 - http://www.w3.org/tr/2004/rec-dom-level-3-core-20040407/core.html#id-745549614 9 - http://www.w3.org/tr/2004/rec-dom-level-3-core-20040407/core.html#id-1312295772 10 - http://www.w3.org/tr/2004/rec-dom-level-3-core-20040407/core.html#id-637646024 7

Introduction au DOM Introduction au DOM Remarque : NameSpace Il existe toutes les fonctions nécessaires pour gérer les namespaces, comme par exemple : NodeList getelementsbytagnamens(string namespaceuri, string localname) Element createelementns(string namespaceuri, string qualifiedname) Attr createattributens(string namespaceuri, string qualifiedname) Complément (Brillant07 [Brillant07], pp238-245) 8 8

Implémentation II - JavaScript du DOM II Introduction à JavaScript 11 Fonctions et objets DOM en JavaScript 13 Spécificités HTML 14 A. Introduction à JavaScript 9

Implémentation JavaScript du DOM Implémentation JavaScript du DOM Définition : JavaScript JavaScript est un langage de programmation instance du standard ECMAScript, principalement utilisé comme langage client dans les navigateurs Web, afin de rendre dynamique l'affichage et la manipulation de pages HTML. Rappel : Intégration JavaScript HTML 1 //file.js 2 function func(parg1, parg2) { 3... 4 } 1 <html> 2 <head> 3... 4 <script src="file.js" type="text/javascript"></script> 5... 6 </head> 7 <body> 8... 9 <div... onclick="func(varg1, varg2)"> 10... 11 </body> 12 </html> Rappel : Introduction au JavaScript http://fr.selfhtml.org/javascript/intro.htm 11 Rappel : Syntaxe JavaScript http://fr.selfhtml.org/javascript/langage 12 Complément : Fonctions JavaScript http://fr.selfhtml.org/javascript/objets/independant.htm 13 Complément : Objets JavaScript http://fr.selfhtml.org/javascript/objets/ 14 Rappel : Console JavaScript Pour afficher la console JavaScript sous Firefox : CTRL+MAJ+J B. Fonctions et objets DOM en JavaScript Exemple 1 vdiv = document.getelementbyid("id1"); 11 - http://fr.selfhtml.org/javascript/intro.htm 12 - http://fr.selfhtml.org/javascript/langage 13 - http://fr.selfhtml.org/javascript/objets/independant.htm 14 - http://fr.selfhtml.org/javascript/objets/ 10 10

Implémentation JavaScript du DOM Exemple 1 vdivs = document.getelementsbytagname("p"); 2 for (var i=0; i<vdivs.length; i++) { 3 vdivs.item(i)...; 4 } Exemple 1 alert(vdiv.firstchild.data) ; Exemple 1 vdiv.removechild(vdiv.firstchild); Exemple 1 vdiv.appendchild(vdiv2); Syntaxe Document http://fr.selfhtml.org/javascript/objets/document.htm 15 Node http://fr.selfhtml.org/javascript/objets/node.htm 16 getelementbyid http://fr.selfhtml.org/javascript/objets/document.htm#get_element_by_id 17 getelementbytagname http://fr.selfhtml.org/javascript/objets/document.htm#get_elements_by_ta g_name 18 firstchild http://fr.selfhtml.org/javascript/objets/node.htm#first_child 19 data http://fr.selfhtml.org/javascript/objets/node.htm#data 20 C. Spécificités HTML Attributs et méthodes spécifiques aux éléments HTML input, select : value, name,... a : href 15 - http://fr.selfhtml.org/javascript/objets/document.htm 16 - http://fr.selfhtml.org/javascript/objets/node.htm 17 - http://fr.selfhtml.org/javascript/objets/document.htm#get_element_by_id 18 - http://fr.selfhtml.org/javascript/objets/document.htm#get_elements_by_tag_name 19 - http://fr.selfhtml.org/javascript/objets/node.htm#first_child 20 - http://fr.selfhtml.org/javascript/objets/node.htm#data 11

Implémentation JavaScript du DOM Implémentation JavaScript du DOM... http://fr.selfhtml.org/javascript/objets/elementshtml.htm 21 queryselectorall : Manipulation HTML via les classes CSS queryselectorall est une méthode de l'objet document permettant de renvoyer une liste de nœuds correspondant à l'union des sélecteurs CSS passés en paramètre. NodeList document.queryselectorall(<list_of_selectors>) https://developer.mozilla.org/en/dom/document.queryselectorall 22 Exemple : queryselectorall 1... 2 <body> 3 <div class="class1">...</div> 4 <div class="class2">...</div> 5 <div class="class1 class2">...</div> 6 <div class="class2 class3">...</div> 7... document.queryselectorall("div.class1, div.class2") renvoie tous les div de l'extrait HTML ci-avant. Conseil : Firebug Installer l'extension Firebug sous Firefox pour pouvoir visualiser dynamiquement le DOM. https://addons.mozilla.org/fr/firefox/addon/firebug/ 23 21 - http://fr.selfhtml.org/javascript/objets/elementshtml.htm 22 - https://developer.mozilla.org/en/dom/document.queryselectorall 23 - https://addons.mozilla.org/fr/firefox/addon/firebug/ 12 12

Fonctions et III - objets JavaScript liés à XML III Utiliser XPath 15 Exécuter une XSLT 15 xmlhttprequest : Communication avec le serveur 16 XMLSerializer : Sérialiser un DOM 17 A. Utiliser XPath L'API XPath est moins pratique que l'api DOM en JavaScript, et en conséquence moins utilisée. Il est néanmoins possible d'exécuter un XPath en fonction d'un nœud courant, les deux étant passés en paramètres à la méthode evaluate() de document. 13

Fonctions et objets JavaScript liés à XML Fonctions et objets JavaScript liés à XML Exemple 1 var nodessnapshot = document.evaluate(<pxpath>, <pcontextnode>, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null ); 2 for ( var i=0 ; i < nodessnapshot.snapshotlength; i++ ) 3 { 4...nodesSnapshot.snapshotItem(i)... 5 } Complément https://developer.mozilla.org/fr/introduction_%c3%a0_l %27utilisation_de_XPath_avec_JavaScript 24 B. Exécuter une XSLT Syntaxe Objet : XSLTProcessor Méthodes : importstylesheet(vxsl) DocumentFragment transformtofragment(vxml,document) Document transformtodocument(vxml) Syntaxe 1 // Chargement d'une XSLT depuis le serveur 2 var vxhr = new XMLHttpRequest(); 3 vxhr.open("get", "fichier.xslt", false); 4 vxhr.send(null); 5 var vxsl = vxhr.responsexml; 6 7 // Initialisation d'un processeur XSLT 8 var vproc = new XSLTProcessor(); 9 vproc.importstylesheet(vxsl); 10 11 // Sélection d'un nœud XML source de la transformation dans le Document 12 var vxml = document.getelementbyid("source"); 13 14 // Exécution de la XSLT dans un DocumentFragment vresult 15 var vresult = vproc.transformtofragment(vxml,document); 16 17 // Ajout de vresult dans le Document 18 document.getelementbyid("source").appendchild(vresult); C. xmlhttprequest : Communication avec le serveur L'objet XMLHttpRequest permet d'envoyer des commandes POST et GET à un serveur HTTP, en particulier (mais pas uniquement) pour transmettre des documents XML entre le client et le serveur. 24 - https://developer.mozilla.org/fr/introduction_%c3%a0_l%27utilisation_de_xpath_avec_javascript 14 14

Fonctions et objets JavaScript liés à XML Exemple : Exécuter un fichier PHP avec des paramètres 1 var vxhr = new XMLHttpRequest(); 2 vxhr.open("post", "fichier.php", false); 3 vxhr.setrequestheader("content-type", "application/x-www-formurlencoded"); 4 var vargs="key1=" + encodeuricomponent(vvalue1) + "&key2=" + encodeuricomponent(vvalue2); 5 vxhr.send(vargs); 1 <?php 2 $vparam1=$_post['key1']; 3 $pparam2=$_post['key2']; 4... 5?> Exemple : Charger un document XML sur le client 1 var vxhr = new XMLHttpRequest(); 2 vxhr.open("get", "fichier.xml", false); 3 vxhr.send(null); 4 vxml vxhr.responsexml; Exemple : Enregistrer un document XML sur le serveur (via PHP) 1 var vxml = document.getelement... //un node DOM 2 var vtxt = (new XMLSerializer()).serializeToString(vXml); 3 var vargs = "xml=" + encodeuricomponent(vtxt); 4 var vxhr = new XMLHttpRequest(); 5 vxhr.open("post", "savexml.php", false); 6 vxhr.setrequestheader("content-type", "application/x-www-formurlencoded"); 7 vxhr.send(vargs); 1 <?php 2 $xml= $_POST["xml"]; 3 $dom = new DomDocument(); 4 $dom->loadxml($xml); 5 $dom->save('src.xml'); 6?> Syntaxe 1 eval(vxhr.responsetext); Permet au client d exécuter une instruction JavaScript qui aura été générée par le serveur PHP (par exemple un compte-rendu d'exécution). Complément http://www.xul.fr/objet-xmlhttprequest.html 25 25 - http://www.xul.fr/objet-xmlhttprequest.html 15

Fonctions et objets JavaScript liés à XML Fonctions et objets JavaScript liés à XML D. XMLSerializer : Sérialiser un DOM 1 var xmlstring = new XMLSerializer().serializeToString(Node); 16 16

IV - Exercices IV Travaux pratiques DOM et JavaScript 19 A. Travaux pratiques DOM et JavaScript 1. "Hello World!" en JavaScript Q u e s t i o n 1 [Solution n 1 p 23] Créer un fichier HTML contenant un bouton. Ajouter la fonction JavaScript qui permet d'afficher "Hello World!" lorsque l'on clique sur le bouton. Q u e s t i o n 2 [Solution n 2 p 23] Ajouter un champ de saisie texte au fichier HTML. Ajouter la fonction JavaScript qui permet d'afficher le contenu de ce champ de saisie lorsque l'on clique sur le bouton. 2. Manipulation du DOM en JavaScript Soit le fichier HTML : 1 <html> 2 <head> 3 <meta http-equiv="content-type" content="text/html; charset=utf-8"> 4 <title>mon titre</title> 5 <script type="text/javascript" src="lib.js"></script> 6 </head> 7 <body> 8 <h1 onclick="showhxcontent(1)">partie 1</h1> 9 <div id="title1" style="display:none"> 10 <p>mon premier paragraphe</p> 11 <p>mon second paragraphe</p> 12 </div> 13 <h1 onclick="showhxcontent(2)">partie 2</h1> 14 <div id="title2" style="display:none"> 15 <p>mon premier paragraphe</p> 16 <p>mon second paragraphe</p> 17 </div> 18 <p> 19 <input type="submit" value="masquer" onclick="hidealldivs()"/> 20 </p> 21 <p> 22 Titre n : <input type="text" id="title"/> 17

Exercices Exercices 23 <input type="submit" value="afficher" onclick="alerttitle()"/> 24 </p> 25 </body> 26 </html> Q u e s t i o n 1 [Solution n 3 p 24] Écrire la fonction JavaScript showhxcontent permettant d'afficher le contenu du div correspondant au titre sur lequel on clique. Indice : 1 function showhxcontent (pnumber) { 2 vdiv = document.getelementbyid(...); 3 vdiv.style.display = "..."; 4 } Q u e s t i o n 2 [Solution n 4 p 24] Écrire la fonction JavaScript hidealldivs permettant de masquer le contenu de tous les div du document. Indice : 1 function hidealldivs () { 2 vdivs = document.getelementsbytagname(...); 3 for (var i=0; i<vdivs...; i++) { 4 vdivs.item(i)...; 5 } 6 } Q u e s t i o n 3 [Solution n 5 p 24] Écrire la fonction alerttitle permettant d'afficher (avec la fonction JavaScript alert) le contenu du énième titre, défini par le champ de saisie title. Indice : 1 function alerttitle () { 2 vhx = document.getelementsbytagname(...); 3 vindice = document.getelementbyid(...).value; 4 vindice = vindice - 1; 5 alert(...); 6 } Q u e s t i o n 4 [Solution n 6 p 24] Écrire la fonction deletetitle permettant d'effacer le contenu du titre défini par le champ title. (suppression du nœud fils de type texte) Indice : 1 function deletetitle () { 2... 3 vhx.item(vindice).removechild(...); 4 } 18 18

Exercices Q u e s t i o n 5 [Solution n 7 p 24] Écrire la fonction definetitle permettant d'affecter le contenu du titre défini par le champ title avec la valeur "Nouveau titre". On testera que le titre a ou non déjà une valeur (nœud texte) avant l'ajout, afin de la supprimer si besoin. Indice : 1 function definetitle () { 2... 3 vtext = document.createtextnode(...); 4 if (vhx.item(vindice)...) { 5... 6 } 7 vhx.item(vindice).appendchild(...); 8 } 3. Un éditeur XML en JavaScript L'objectif de ce TP est de réaliser un éditeur XML avec HTML et JavaScript. Soit le fichier XHTML "editor.html" ci-après. 1 <html> 2 <!--editor.html--> 3 <head> 4 <meta http-equiv="content-type" content="text/html; charset=utf-8"> 5 <title>éditeur de document</title> 6 <script type="text/javascript" src="lib.js"></script> 7 </head> 8 <body id="body"> 9 <h1>édition</h1> 10 <form> 11 <p>ajouter un paragraphe</p> 12 <input type="text" size="50" id="text"/> 13 <input type="button" onclick="addpara(document.getelementbyid('text').value);" value="ajouter"/> 14 <br/> 15 <input type="button" onclick="alertxml(document);" value="afficher DOM"/> 16 <br/> 17 <input type="button" onclick="savexml();" value="sérialiser XML"/> 18 </form> 19 <hr> 20 <div id="visu"> 21 <h1>visualisation</h1> 22 <script type="text/javascript"> 23 //ouvre le fichier XML sur le serveur 24 var xml = loadxml("src.xml"); 25 //ouvre le fichier XSLT sur le serveur 26 var xsl = loadxml("xml2html.xsl"); 27 //exécute le XSLT sur le XML 28 res=execxslt(xml,xsl); 29 //afficher le résultat 30 document.getelementbyid("visu").appendchild(res); 31 </script> 32 </div> 33 </body> 34 </html> 19

Exercices Exercices Q u e s t i o n 1 Expliquer le fonctionnement de "editor.html". [Solution n 8 p 24] Q u e s t i o n 2 Créer un fichier XML avec un élément racine document contenant des éléments paragraphe. Le placer sur un serveur Web et le rendre accessible en lecture/écriture. Indice : 1 <?xml version="1.0" encoding="utf-8"?> 2 <document> 3 <paragraphe>lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque sit ametlibero ac mauris egestas venenatis nec vitae sapien. Vestibulum ante ipsum primis infaucibus orci luctus et ultrices posuere cubilia Curae; Ut commodo, neque at auctortincidunt, turpis quam molestie augue, sit amet mattis nibh neque eget felis.</paragraphe> 4 <paragraphe>donec a lectus sed augue pellentesque accumsan eu ac justo. Etiam est urna, sagittisac cursus nec, placerat quis velit.</paragraphe> 5 </document> Q u e s t i o n 3 [Solution n 9 p 25] Écrire les XSLT xml2html.xsl et html2xml.xsl, puis les déposer sur le serveur à côté du fichier XML. Q u e s t i o n 4 [Solution n 10 p 25] Écrire les fonctions loadxml et alertxml (la seconde permettant de tester la première). Indice : Pour loadxml utiliser XMLHttpRequest : xmlhttprequest : Communication avec le serveur Pour alertxml utiliser XMLSerializer : XMLSerializer : Sérialiser un DOM Q u e s t i o n 5 Écrire la fonction execxslt. [Solution n 11 p 26] Indice : Exécuter une XSLT Q u e s t i o n 6 Écrire la fonction addpara. [Solution n 12 p 26] Q u e s t i o n 7 Écrire la fonction savexml permettant d'exécuter le fichier PHP ci-après. [Solution n 13 p 26] 1 <?php 2 //savexml.php 20 20

Exercices 3 $xml= $_POST["xml"]; 4 $dom = new DomDocument(); 5 $dom->loadxml($xml); 6 $dom->save('src.xml'); 7?> 21

Solution des exercices > Solution n 1 (exercice p. 17) hw.html 1 <html> 2 <head> 3 <meta http-equiv="content-type" content="text/html; charset=utf-8"> 4 <title>hello World!</title> 5 <script type="text/javascript" src="hw.js"></script> 6 </head> 7 <body> 8 <input type="button" onclick="hw()" value="clic me!"/> 9 </body> 10 </html> hw.js 1 function hw () { 2 alert("hello World") 3 } > Solution n 2 (exercice p. 17) hw.html 1 <html> 2 <head> 3 <meta http-equiv="content-type" content="text/html; charset=utf-8"> 4 <title>hello World!</title> 5 <script type="text/javascript" src="hw.js"></script> 6 </head> 7 <body> 8 <input type="text" id="text"/> 9 <input type="button" onclick="hw2()" value="clic me!"/> 10 </body> 11 </html> hw.js 1 function hw2() { 2 alert (document.getelementbyid('text').value) 3 } 23

Solution des exercices Solution des exercices > Solution n 3 (exercice p. 18) 1 function showhxcontent (pnumber) { 2 vdiv = document.getelementbyid("title" + pnumber); 3 vdiv.style.display = "block"; 4 } > Solution n 4 (exercice p. 18) 1 function hidealldivs () { 2 vdivs = document.getelementsbytagname("div"); 3 for (var i=0; i<vdivs.length; i++) { 4 vdivs.item(i).style.display="none"; 5 } 6 } > Solution n 5 (exercice p. 18) 1 function alerttitle () { 2 vhx = document.getelementsbytagname("h1"); 3 vindice = document.getelementbyid("title").value; 4 vindice = vindice - 1; 5 alert(vhx.item(vindice).firstchild.data); 6 } > Solution n 6 (exercice p. 18) 1 function deletetitle () { 2 vhx = document.getelementsbytagname("h1"); 3 vindice = document.getelementbyid("title").value; 4 vindice = vindice - 1; 5 vhx.item(vindice).removechild(vhx.item(vindice).firstchild); 6 } > Solution n 7 (exercice p. 19) 1 function definetitle () { 2 vhx = document.getelementsbytagname("h1"); 3 vindice = document.getelementbyid("title").value; 4 vindice = vindice - 1; 5 vtext = document.createtextnode("nouveau titre"); 6 if (vhx.item(vindice).haschildnodes()) { 7 vhx.item(vindice).removechild(vhx.item(vindice).firstchild); 8 } 9 vhx.item(vindice).appendchild(vtext); 10 } > Solution n 8 (exercice p. 20) 1. Après avoir affiché les éléments statiques, le script charge un fichier XML situé sur le serveur (src.xml). 2. Il lui applique une XSLT située sur le serveur pour le transformer en HTML 24 24

Solution des exercices (xml2html.xsl). 3. Il affiche le résultat dans un div de la page (<div id="visu">). 4. Le formulaire propose de : a. modifier le DOM du HTML en JavaScript (function addpara()) ; b. afficher le code HTML correspondant au DOM courant (function alertxml(document)) ; c. sérialiser le DOM sur le serveur, à la place du fichier XML source (function savexml ()) : i. en appliquant une XSLT inverse de la première (html2xml.xsl), ii. puis en postant le flux XML obtenu à une page PHP (savexml.php), iii. qui écrase le fichier src.xml avec la nouvelle sérialisation du DOM. > Solution n 9 (exercice p. 20) html2xml.xsl 1 <?xml version="1.0" encoding="utf-8"?> 2 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/xsl/transform" version="1.0"> 3 <xsl:output method="xml"/> 4 <xsl:template match="div"> 5 <document> 6 <xsl:apply-templates select="p"/> 7 </document> 8 </xsl:template> 9 <xsl:template match="p"> 10 <paragraphe><xsl:value-of select="."/></paragraphe> 11 </xsl:template> 12 </xsl:stylesheet> xml2html.xsl 1 <?xml version="1.0" encoding="utf-8"?> 2 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/xsl/transform" version="1.0"> 3 <xsl:output method="html"/> 4 <xsl:template match="document"> 5 <div id="srcxml"> 6 <xsl:apply-templates select="paragraphe"/> 7 </div> 8 </xsl:template> 9 <xsl:template match="paragraphe"> 10 <p><xsl:value-of select="."/></p> 11 </xsl:template> 12 </xsl:stylesheet> > Solution n 10 (exercice p. 20) 1 function loadxml (ppath){ 2 var vxhr = new XMLHttpRequest(); 3 vxhr.open("get", ppath, false); 4 vxhr.send(null); 5 return rxml = vxhr.responsexml; 6 } 7 function alertxml (pdom) { 8 var xmlstring = new XMLSerializer().serializeToString(pDom); 9 alert(xmlstring); 10 } 25

Solution des exercices Solution des exercices > Solution n 11 (exercice p. 20) 1 function execxslt (pxml, pxsl) { 2 var proc = new XSLTProcessor(); 3 proc.importstylesheet(pxsl); 4 return proc.transformtofragment(pxml,document); 5 } > Solution n 12 (exercice p. 20) 1 function addpara (ptext) { 2 vnewp = document.createelement("p"); 3 vnewp.appendchild(document.createtextnode(ptext)); 4 document.getelementbyid("srcxml").appendchild(vnewp); 5 } > Solution n 13 (exercice p. 20) 1 function savexml () { 2 var xsl = loadxml("html2xml.xsl"); 3 var xml = document.getelementbyid("srcxml"); 4 var proc = new XSLTProcessor(); 5 proc.importstylesheet(xsl); 6 var res = proc.transformtodocument(xml); 7 var restxt = (new XMLSerializer()).serializeToString(res); 8 var data = "xml=" + encodeuricomponent(restxt); 9 var vxhr = new XMLHttpRequest(); 10 vxhr.open("post", "savexml.php", false); 11 vxhr.setrequestheader("content-type", "application/x-www-formurlencoded"); 12 vxhr.send(data); 13 } 26 26

Bibliographie [Brillant07] ALEXANDRE BRILLANT, XML : Cours et exercices, Eyrolles, 2007 [ISBN 978-2212126914] 27

Contenus annexes - L'arbre du document XML Il est possible de représenter un document XML sous forme d'arbre, tel que : L'arbre possède une racine / qui a comme fils l'élément racine l'élément racine est l'élément du document XML qui contient tous les autres chaque nœud a comme fils les éléments et le texte qu'il contient, ainsi que ses attributs. Exemple : Fichier XML 1 <?xml version="1.0" encoding="utf-8"?> 2 <document modele="ulcoursgeneral" code="bp-incendie3_s1_e2_ul1"> 3 <entete> 4 <identification> 5 <titre>l'assurance de la responsabilité de voisinage</titre> 6 <date>21/02/01</date> 7 <auteur>aea</auteur> 8 <version>1.00</version> 9 </identification> 10 </entete> 11 <corps> 12 <contenu> 13 <paragraphe>cette garantie est appelée : recours des voisins et des tiers.</paragraphe> 14 <remarque> 15 <paragraphe>l'image suivante <ressource URIsrc="img07.jpg" titre="recours des voisins et des tiers" type="image"/> montre la garantie.</paragraphe> 16 </remarque> 17 </contenu> 18 </corps> 19 </document> Exemple : Arbre XML 1 / 2 document 3 @modele = "ULCoursGeneral" 4 @code = "BP-Incendie3_S1_E2_UL1" 5 entete 6 identification 7 titre 8 text() = "L'assurance de..." 9 date 10 text() = "21/02/01" 11 auteur 12 text() = "AEA" 29

Contenus annexes Contenus annexes 13 version 14 text() = "1.00" 15 corps 16 contenu 17 paragraphe 18 text() = "Cette garantie..." 19 remarque 20 paragraphe 21 text() = "L'image suivante" 22 ressource 23 @URIsrc = "img07.jpg" 24 @titre = "Recours des voisins..." 25 @type = "image" 26 text() = "montre la garantie." Remarque : Ordre des nœuds L'ensemble des nœuds de l'arbre d'un document est muni d'un ordre, qui est celui de l'ordre dans le document XML sérialisé. 30 30