web-dev-qa-db-fra.com

Créer du XML en Javascript

Je me demande s'il est possible de créer un fichier XML avec des données en Javascript. J'ai les données stockées dans des variables.

J'ai googlé un peu et il ne semble pas que l'on en parle beaucoup. Je pensais pouvoir utiliser XMLWriter comme ceci:

var XML = new XMLWriter();
XML.BeginNode ("testing");
XML.Node("testingOne");
XML.Node("TestingTwo");
XML.Node("TestingThree");
XML.EndNode();

comme indiqué dans ce tutoriel: EHow Tutorial

Cependant, quand j'exécute ce code, j'obtiens l'erreur suivante:

ReferenceError: XMLWriter is not defined

Des idées sur la façon dont je peux commencer avec ça?

Merci d'avance!

32
BigBug

Avertissement: La réponse suivante suppose que vous utilisez l'environnement JavaScript d'un navigateur Web.

JavaScript gère XML avec des "objets DOM XML". Vous pouvez obtenir un tel objet de trois manières:

1. Création d'un nouvel objet DOM XML

var xmlDoc = document.implementation.createDocument(null, "books");

Le premier argument peut contenir l'URI de l'espace de noms du document à créer, si le document en appartient à un.

Source: https://developer.mozilla.org/en-US/docs/Web/API/DOMImplementation/createDocument

2. Récupérer un fichier XML avec XMLHttpRequest

var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (xhttp.readyState == 4 && xhttp.status == 200) {

    var xmlDoc = xhttp.responseXML; //important to use responseXML here
}
xhttp.open("GET", "books.xml", true);
xhttp.send();

3. Analyse d'une chaîne contenant du code XML sérialisé

var xmlString = "<root></root>";
var parser = new DOMParser();
var xmlDoc = parser.parseFromString(xmlString, "text/xml"); //important to use "text/xml"

Lorsque vous avez obtenu un objet XML DOM, vous pouvez utiliser des méthodes pour le manipuler comme

var node = xmlDoc.createElement("heyHo");
var elements = xmlDoc.getElementsByTagName("root");
elements[0].appendChild(node);

Pour une référence complète, voir http://www.w3schools.com/xml/dom_intro.asp

Remarque: Il est important que vous n'utilisiez pas les méthodes fournies par l'espace de nom de document, i. e.

var node = document.createElement("Item");

Cela créera des nœuds HTML au lieu de nœuds XML et donnera un nœud avec des noms de balises minuscules. Les noms de balises XML sont sensibles à la casse contrairement aux noms de balises HTML.

Vous pouvez sérialiser des objets XML DOM comme ceci:

var serializer = new XMLSerializer();
var xmlString = serializer.serializeToString(xmlDoc);
54
Seb3736

Considérez que nous devons créer le document XML suivant:

<?xml version="1.0"?>
<people>
  <person first-name="eric" middle-initial="H" last-name="jung">
    <address street="321 south st" city="denver" state="co" country="usa"/>
    <address street="123 main st" city="arlington" state="ma" country="usa"/>
  </person>

  <person first-name="jed" last-name="brown">
    <address street="321 north st" city="atlanta" state="ga" country="usa"/>
    <address street="123 west st" city="seattle" state="wa" country="usa"/>
    <address street="321 south avenue" city="denver" state="co" country="usa"/>
  </person>
</people>

nous pouvons écrire le code suivant pour générer le XML ci-dessus

var doc = document.implementation.createDocument("", "", null);
var peopleElem = doc.createElement("people");

var personElem1 = doc.createElement("person");
personElem1.setAttribute("first-name", "eric");
personElem1.setAttribute("middle-initial", "h");
personElem1.setAttribute("last-name", "jung");

var addressElem1 = doc.createElement("address");
addressElem1.setAttribute("street", "321 south st");
addressElem1.setAttribute("city", "denver");
addressElem1.setAttribute("state", "co");
addressElem1.setAttribute("country", "usa");
personElem1.appendChild(addressElem1);

var addressElem2 = doc.createElement("address");
addressElem2.setAttribute("street", "123 main st");
addressElem2.setAttribute("city", "arlington");
addressElem2.setAttribute("state", "ma");
addressElem2.setAttribute("country", "usa");
personElem1.appendChild(addressElem2);

var personElem2 = doc.createElement("person");
personElem2.setAttribute("first-name", "jed");
personElem2.setAttribute("last-name", "brown");

var addressElem3 = doc.createElement("address");
addressElem3.setAttribute("street", "321 north st");
addressElem3.setAttribute("city", "atlanta");
addressElem3.setAttribute("state", "ga");
addressElem3.setAttribute("country", "usa");
personElem2.appendChild(addressElem3);

var addressElem4 = doc.createElement("address");
addressElem4.setAttribute("street", "123 west st");
addressElem4.setAttribute("city", "seattle");
addressElem4.setAttribute("state", "wa");
addressElem4.setAttribute("country", "usa");
personElem2.appendChild(addressElem4);

var addressElem5 = doc.createElement("address");
addressElem5.setAttribute("street", "321 south avenue");
addressElem5.setAttribute("city", "denver");
addressElem5.setAttribute("state", "co");
addressElem5.setAttribute("country", "usa");
personElem2.appendChild(addressElem5);

peopleElem.appendChild(personElem1);
peopleElem.appendChild(personElem2);
doc.appendChild(peopleElem);

Si du texte doit être écrit entre une balise, nous pouvons utiliser la propriété innerHTML pour l'obtenir.

Exemple

elem = doc.createElement("Gender")
elem.innerHTML = "Male"
parent_elem.appendChild(elem)

Pour plus de détails, veuillez suivre le lien ci-dessous. L'exemple ci-dessus a été expliqué plus en détail.

https://developer.mozilla.org/en-US/docs/Web/API/Document_object_model/How_to_create_a_DOM_tree

9
kkk

ce travail pour moi ..

var xml  = parser.parseFromString('<?xml version="1.0" encoding="utf-8"?><root></root>', "application/xml");

developer.mozilla.org/en-US/docs/Web/API/DOMParser

4
elad gasner

Simplement utiliser

var xmlString = '<?xml version="1.0" ?><root />';
var xml = jQuery.parseXML(xml);

C'est jQuery.parseXML , vous n'avez donc pas à vous soucier des astuces concernant plusieurs navigateurs. Utilisez jQuery comme HTML, il utilise le moteur XML natif.

2
metadings

Ne fonctionne que dans IE

 $(function(){

        var xml = '<?xml version="1.0"?><foo><bar>bar</bar></foo>'; 

        var xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
        xmlDoc.async="false";
        xmlDoc.loadXML(xml);

        alert(xmlDoc.xml);

    });

Ensuite, appuyez sur xmlDoc.xml dans votre code Java.

2
srijan

Votre code fait référence cette bibliothèque

Vous pouvez l'inclure et votre code en question devrait alors fonctionner tel quel. Si vous souhaitez le faire sans ajouter de préfixe à la bibliothèque et ne le construire qu'avec des fonctions intégrées, suivez la réponse de @ Seb3736.

Dans un exemple de navigateur

<html>
<head>
    <script src="Global.js" language="javascript"></script>
    <script src="XMLWriter.js" language="javascript"></script>
    <script language="javascript" type="text/javascript">
        function genXML(){
            var XML = new XMLWriter();
            XML.BeginNode ("testing");
            XML.Node("testingOne");
            XML.Node("TestingTwo");
            XML.Node("TestingThree");
            XML.EndNode();
            //Do something... eg.
            console.log(XML.ToString); //Yes ToString() not toString()
        }
    </script>
</head>
<body>
    <input type="submit" value="genXML" onclick="genXML();">
</body>
</html>

0
user3051040

xml-writer (paquet npm) Je pense que c'est le bon moyen de créer et d'écrire un fichier xml facilement. En outre, il peut être utilisé côté serveur avec nodejs.

var XMLWriter = require('xml-writer');
xw = new XMLWriter;
xw.startDocument();
xw.startElement('root');
xw.writeAttribute('foo', 'value');
xw.text('Some content');
xw.endDocument();
console.log(xw.toString());
0
qant