Bonjour à tous,
je cherche à faire un formulaire HTML pour modifier du contenu XML, avec des champs (input/textarea/checkbox, etc) pour modifier certaines valeurs des fichiers XML, le tout en javascript.
L'idée est de mettre, dans chaque input, un attribut particulier qui contiendrait le xpath de la valeur recherchée dans le XML; laisser l'utilisateur modifier la valeur, et voir (en "temps réel" ) le XML se mettre à jour.
le problème : j'arrive, grace à XPath, à récupérer la valeur que je veux dans le XML, mais ensuite je n'arrive pas à mettre à jour le XML, parce que la valeur que je récupère via la fonction evaluate est une copie du noeud, et pas le noeud lui-même dans son contexte.
Le code :
Code :
- <script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
- <script>
- function updateXml(input) {
- newvalue = $(input).val();
- xmlStr = $("#xml" ).val();
- if(xmlStr=="" ) return;
- xmlObj = $.parseXML(xmlStr);
- xpath = $(input).attr('data-xpath');
- result = xmlObj.evaluate(xpath, xmlObj, null, XPathResult.ANY_TYPE, null);
- element = result.iterateNext();
- //element est une copie du noeud, je n'arrive pas à le modifier...
-
- //ceci fonctionne, mais le chemin est "hardcodé"... je voudrais le calculer à partir du xpath...
- xmlObj.getElementsByTagName("person" )[0].getElementsByTagName("name" )[0].innerHTML = newvalue;
- var xmlText = new XMLSerializer().serializeToString(xmlObj);
- $("#xml" ).val(xmlText);
- }
- </script>
- <form>
- <input onkeyup="updateXml(this);" data-xpath="/person/name" />
- <textarea id="xml" style="width: 800px;height: 600px;">
- <?xml version="1.0" encoding="ISO-8859-1"?>
- <person>
- <name>Paul</name>
- <age>12</age>
- </person>
- </textarea>
- </form>
|
Est ce que vous avez une idée de comment retrouver le "element" dans l'arbre afin que je puisse le modifier et reconstruire le XML ?
ou alors une autre façon de faire?
merci
PS : le XML est simplifié à l'extrème, en situation, il est évidemment plus complexe ; les valeurs ne sont pas toujours à la même profondeur, etc
PS1 : je ne peux pas mettre d'id aux noeuds de mon XML. En fait, je ne peux pas en choisir la structure.
PS2 : je ne fais qu'un interateNext(), je verrai comment faire quand il y aura plusieurs éléments à gérer.