AJAX dans Konqueror / Safari
Du XML dans Konqueror
Pour charger un document XML dans Konqueror et le manipuler avec le DOM, il faut au préalable créer le document et charger le texte XML. Comme suit dans cet exemple JS :
var Doc = "<"."?xml version='1.0' encoding='utf-8'?".">\
<root2>\
<child1>Contenu1</child1>\
<child2>Contenu2\
<child21>Contenu du 21</child21>\
Fin du contenu 2\
</child2>\
<child3>Contenu3</child3>\
<child4>Contenu4</child4>\
</root2>"
//
var XMLDoc = document.implementation.createDocument();
XMLDoc.loadXML(Doc);
var Root = XMLDoc.documentElement;</code>
<p>A partir de là on a un objet JS (Root) qui représente la version DOM de notre document XML. Si vous ne me croyez pas, essayez d'utiliser la fonction suivante qui parse le DOM en question :</p>
<code legend='A appeler comme suit : getNodeHierarchy(Root, 0)'>function getNodeHierarchy(node, level)
{
var Output = typeof node+"-"+level+" : "+node.nodeName+", "+NodeTypesDisplay[node.nodeType]+", "+node.nodeValue+"\n";
if (!node.childNodes.length) return Output
node = node.firstChild
do { Output += getNodeHierarchy(node, level+1) } while (node = node.nextSibling);
return Output
}
La fonction précédente avec notre XML d'exemple affichera :
object-0 : root, Node, null object-1 : #text, Texte, object-1 : child1, Node, null object-2 : #text, Texte, On object-1 : #text, Texte, object-1 : child2, Node, null object-2 : #text, Texte, Contenu2 object-2 : child21, Node, null object-3 : #text, Texte, Contenu du 21 object-2 : #text, Texte, Fin du contenu 2 object-1 : #text, Texte, object-1 : child3, Node, null object-2 : #text, Texte, Con object-2 : b, Node, null object-3 : #text, Texte, tenu3 object-1 : #text, Texte, object-1 : child4, Node, null object-2 : #text, Texte, Contenu4 object-1 : #text, Texte,
Jusque là tout va bien, mais comment nourrir un script avec un XML dynamique, i.e. que l'on ne peut pas hardcoder et que l'on peut même recharger plusieurs fois au cours du déroulement de l'application ? C'est très simple : on intègre une iframe dans la page web, on règle l'attribut src de cette iframe à une URL correspondant au fichier et en utilisant l'évènement onLoad de l'iframe on peut recopier peu ou prou les trois lignes qui crée le document XML et qui charge les données. Seul problème, si on essaye, Konqueror va transformer le XML en document HTML pour le rendre (c'est une IFrame après tout) alors plutôt que d'essayer tout de suite de faire des XSL pour pallier à ça, on construit une petite passerelle PHP qui va servir un fichier en transformant les < en < et les > en >. J'ai presque honte de faire ça mais ça fonctionne très bien, vous allez voir. Voici déjà la passerelle PHP qui sert les fichiers XML transformés :
<?
if (!isset($_GET["file"])) die("Pas de paramètre qui indique un fichier à servir");
$FilePath = $_GET["file"];
while (true) {
if (strpos("/", \$FilePath) !== false) die("Interdit");
if (file_exists($FilePath)) break;
$Temp = rawurldecode($FilePath);
if ($Temp == $FilePath) die("Fichier introuvable");
}
$Contents = file_get_contents($FilePath);
echo str_replace("<", "<", str_replace(">", ">", $Contents));
?"."></code>
<p>Ainsi, en utilisant cette passerelle et en interceptant l'évènement onLoad de l'iframe avec la fonction JS suivante on obtient le même résultat que précédemment mais sans avoir hardcodé le XML :</p>
<code>function ReceiveDatas()
{
var Input = document.getElementById("inputXML")
if (!Input.src.length) return
var XMLContent = Input.contentDocument.body.innerHTML
XMLContent = XMLContent.replace(/&lt;/g, "<").replace(/&gt;/g, ">")
//
var XMLDoc = document.implementation.createDocument();
XMLDoc.loadXML(XMLContent)
var Root = XMLDoc.documentElement
alert(getNodeHierarchy(Root, 0))
}?>
Et ça y est, Konqueror peut charger et manipuler du XML comme un grand. Maintenant qu'on a trouvé une méthode pour charger un XML "à la main", pour les navigateurs équipés passons à...
