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.
<html><!--editor.html--><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Éditeur de document</title>
<script type="text/javascript" src="lib.js"></script>
</head><body id="body">
<h1>Édition</h1>
<form><p>Ajouter un paragraphe</p>
<input type="text" size="50" id="text"/>
<input type="button" onclick="addPara(document.getElementById('text').value);" value="ajouter"/>
<br/><input type="button" onclick="alertXml(document);" value="Afficher DOM"/>
<br/><input type="button" onclick="saveXml();" value="Sérialiser XML"/>
</form> <hr><div id="visu">
<h1>Visualisation</h1>
<script type="text/javascript">
//ouvre le fichier XML sur le serveurvar xml = loadXml("src.xml");
//ouvre le fichier XSLT sur le serveurvar xsl = loadXml("xml2html.xsl");
//exécute le XSLT sur le XMLres=execXslt(xml,xsl);
//afficher le résultatdocument.getElementById("visu").appendChild(res);
</script></div></body></html>Question
Expliquer le fonctionnement de "editor.html".
Solution
Après avoir affiché les éléments statiques, le script charge un fichier XML situé sur le serveur (
src.xml).Il lui applique une XSLT située sur le serveur pour le transformer en HTML (
xml2html.xsl).Il affiche le résultat dans un
divde la page (<div id="visu">).Le formulaire propose de :
modifier le DOM du HTML en JavaScript (
function addPara()) ;afficher le code HTML correspondant au DOM courant (
function alertXml(document)) ;sérialiser le DOM sur le serveur, à la place du fichier XML source (
function saveXml ()) :en appliquant une XSLT inverse de la première (
html2xml.xsl),puis en postant le flux XML obtenu à une page PHP (
saveXml.php),qui écrase le fichier
src.xmlavec la nouvelle sérialisation du DOM.
Question
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
<document><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>
<paragraphe>Donec a lectus sed augue pellentesque accumsan eu ac justo. Etiam est urna, sagittisac cursus nec, placerat quis velit.</paragraphe>
</document>Question
Écrire les XSLT xml2html.xsl et html2xml.xsl, puis les déposer sur le serveur à côté du fichier XML.
Solution
html2xml.xsl
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml"/>
<xsl:template match="div">
<document><xsl:apply-templates select="p"/>
</document></xsl:template><xsl:template match="p">
<paragraphe><xsl:value-of select="."/></paragraphe>
</xsl:template></xsl:stylesheet>xml2html.xsl
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html"/>
<xsl:template match="document">
<div id="srcXml">
<xsl:apply-templates select="paragraphe"/>
</div></xsl:template><xsl:template match="paragraphe">
<p><xsl:value-of select="."/></p>
</xsl:template></xsl:stylesheet>Question
Écrire les fonctions loadXml et alertXml (la seconde permettant de tester la première).
Indice
Pour
loadXmlutiliserXMLHttpRequest: xmlHttpRequest : Communication avec le serveurPour
alertXmlutiliserXMLSerializer: XMLSerializer : Sérialiser un DOM
Solution
function loadXml (pPath){
var vXhr = new XMLHttpRequest();
vXhr.open("GET", pPath, false);
vXhr.send(null);
return rXml = vXhr.responseXML;
}
function alertXml (pDom) {
var xmlString = new XMLSerializer().serializeToString(pDom);
alert(xmlString);
}
Question
Écrire la fonction execXslt.
Solution
function execXslt (pXml, pXsl) {
var proc = new XSLTProcessor();
proc.importStylesheet(pXsl);
return proc.transformToFragment(pXml,document);
}
Question
Écrire la fonction addPara.
Solution
function addPara (pText) {
vNewP = document.createElement("p");
vNewP.appendChild(document.createTextNode(pText));
document.getElementById("srcXml").appendChild(vNewP);
}
Question
Écrire la fonction saveXml permettant d'exécuter le fichier PHP ci-après.
<?php
//saveXml.php$xml= $_POST["xml"];
$dom = new DomDocument();
$dom->loadXML($xml);
$dom->save('src.xml');
?>Solution
function saveXml () {
var xsl = loadXml("html2xml.xsl");
var xml = document.getElementById("srcXml");
var proc = new XSLTProcessor();
proc.importStylesheet(xsl);
var res = proc.transformToDocument(xml);
var resTxt = (new XMLSerializer()).serializeToString(res);
var data = "xml=" + encodeURIComponent(resTxt);
var vXhr = new XMLHttpRequest();
vXhr.open("POST", "saveXml.php", false);
vXhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
vXhr.send(data);
}