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 serveur
var xml = loadXml("src.xml");
//ouvre le fichier XSLT sur le serveur
var xsl = loadXml("xml2html.xsl");
//exécute le XSLT sur le XML
res=execXslt(xml,xsl);
//afficher le résultat
document.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
div
de 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.xml
avec 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
loadXml
utiliserXMLHttpRequest
: xmlHttpRequest : Communication avec le serveurPour
alertXml
utiliserXMLSerializer
: 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);
}