165 votes

Convertir XML en JSON (et inversement) en utilisant Javascript

Comment convertir du XML en JSON, puis de nouveau en XML ?

Les outils suivants fonctionnent assez bien, mais ne sont pas totalement cohérents :

Quelqu'un a-t-il déjà rencontré cette situation ?

11 votes

Expliquez les incohérences, s'il vous plaît.

4 votes

Plus précisément, il s'agissait de convertir des tableaux JSON avec un seul élément en XML. Lorsque vous le reconvertissiez en JSON, au lieu d'un tableau à un élément, il créait un objet littéral. Je l'ai contourné en vérifiant le type avec $.isArray(), et en l'intégrant dans un tableau si !$.isArray().

1 votes

Xml2json - fyneworks.com/jquery/xml-to-json - Les ruptures lancent 500 à partir du 15/02/2013 14:25 AEST

120voto

Josh Stodola Points 42410

Je pense que c'est le meilleur : Conversion entre XML et JSON

Veillez à lire le article d'accompagnement sur le site xml.com O'Reilly qui décrit en détail les problèmes liés à ces conversions, ce qui, je pense, vous éclairera. Le fait que O'Reilly héberge l'article devrait indiquer que la solution de Stefan a du mérite.

1 votes

Merci pour la réponse ! Dans mon cas, le JSON est la représentation canonique, et le XML est juste utilisé pour le XSLT dont l'utilisation n'est pas mon idée ! :)

1 votes

C'est seulement dans le navigateur. Cela ne s'applique pas à node.js ou aux environnements sans navigateur. D'autres idées ?

1 votes

En ce qui concerne le commentaire de @JasonDenizac, je ne suis pas sûr de comprendre comment ce lien aide à résoudre le problème d'avoir un objet au lieu d'un tableau d'un élément...

55voto

abdmob Points 734

https://github.com/abdmob/x2js - ma propre bibliothèque (URL mis à jour de http://code.google.com/p/x2js/ ) :

Cette bibliothèque fournit des fonctions de conversion de XML en JSON (JavaScript Objects) et vice versa. Cette bibliothèque est très petite et ne nécessite aucune autre bibliothèque supplémentaire.

Fonctions API

  • new X2JS() - pour créer votre instance et accéder à toutes les fonctionnalités de la bibliothèque. Vous pouvez également spécifier des options de configuration facultatives ici
  • X2JS.xml2json - Convertir le XML spécifié comme objet DOM en JSON
  • X2JS.json2xml - Convertir JSON en objet DOM XML
  • X2JS.xml_str2json - Convertit le XML spécifié comme chaîne en JSON
  • X2JS.json2xml_str - Convertit JSON en chaîne XML

Démonstration en ligne sur http://jsfiddle.net/abdmob/gkxucxrj/1/

var x2js = new X2JS();
function convertXml2JSon() {
    $("#jsonArea").val(JSON.stringify(x2js.xml_str2json($("#xmlArea").val())));
}

function convertJSon2XML() {
    $("#xmlArea").val(x2js.json2xml_str($.parseJSON($("#jsonArea").val())));
}

convertXml2JSon();
convertJSon2XML();
$("#convertToJsonBtn").click(convertXml2JSon);
$("#convertToXmlBtn").click(convertJSon2XML);

1 votes

Bonjour, comment avez-vous résolu le problème où si vous avez un objet dans un objet, il est dans un objet littéral, où s'il y a n > 1 objets, vous avez un tableau. Cela rend difficile l'utilisation des objets xml to json dans les templates...

0 votes

Oui, vous devez utiliser une astuce et cela dépend de vos connaissances sur la structure XML (car pas de XSD ici). Utilisez la syntaxe <node>...<node>_asArray pour accéder à votre noeud toujours comme un tableau (séquence).

1 votes

Sample:// Chaîne XML vers JSON var xmlText = "<MyOperation><test>Success</test><test2><item>ddsfg</item><item>dsdgfd</item></test2></MyOperation>" ; varsonObj = X2JS. xml_str2json( xmlText ) ; alert (jsonObj.MyOperation.test) ; alert (jsonObj.MyOperation.test_asArray[0]) ;

35voto

Ryan Conrad Points 11

Ces réponses m'ont beaucoup aidé à réaliser cette fonction :

function xml2json(xml) {
  try {
    var obj = {};
    if (xml.children.length > 0) {
      for (var i = 0; i < xml.children.length; i++) {
        var item = xml.children.item(i);
        var nodeName = item.nodeName;

        if (typeof (obj[nodeName]) == "undefined") {
          obj[nodeName] = xml2json(item);
        } else {
          if (typeof (obj[nodeName].push) == "undefined") {
            var old = obj[nodeName];

            obj[nodeName] = [];
            obj[nodeName].push(old);
          }
          obj[nodeName].push(xml2json(item));
        }
      }
    } else {
      obj = xml.textContent;
    }
    return obj;
  } catch (e) {
      console.log(e.message);
  }
}

Tant que vous passez dans un objet jquery dom/xml : pour moi c'était :

Jquery(this).find('content').eq(0)[0]

contenu était le champ dans lequel je stockais mon xml.

0 votes

A sauvé ma journée ! Presque tous les autres exemples ne fonctionnent pas, même ceux de JSFiddle !

0 votes

Fonctionne plutôt bien jusqu'à présent. Je vous remercie.

17voto

MasterPiece Points 103

J'ai créé une fonction récursive basée sur regex, au cas où vous ne voudriez pas installer la bibliothèque et comprendre la logique derrière ce qui se passe :

const xmlSample = '<tag>tag content</tag><tag2>another content</tag2><tag3><insideTag>inside content</insideTag><emptyTag /></tag3>';
console.log(parseXmlToJson(xmlSample));

function parseXmlToJson(xml) {
    const json = {};
    for (const res of xml.matchAll(/(?:<(\w*)(?:\s[^>]*)*>)((?:(?!<\1).)*)(?:<\/\1>)|<(\w*)(?:\s*)*\/>/gm)) {
        const key = res[1] || res[3];
        const value = res[2] && parseXmlToJson(res[2]);
        json[key] = ((value && Object.keys(value).length) ? value : res[2]) || null;

    }
    return json;
}

Explication de la Regex pour chaque boucle :

  • res[0] - retourne le xml (tel quel)
  • res[1] - retourne le nom du tag xml
  • res[2] - retourne le contenu xml
  • res[3] - renvoie le nom de la balise xml au cas où la balise se ferme d'elle-même. En exemple : <tag />

Vous pouvez vérifier le fonctionnement de la regex ici : https://regex101.com/r/ZJpCAL/1

Note : Dans le cas où json a une clé avec une valeur indéfinie, elle est supprimée. C'est pourquoi j'ai inséré null à la fin de la ligne 9.

0 votes

C'est fantastique. Ça a marché comme un charme !

0 votes

Ne fonctionne pas comme prévu les valeurs de chaînes xml imbriquées profondément.

0 votes

@sankarmuniyappa veuillez écrire un exemple qui n'a pas fonctionné pour que je le corrige :)

4voto

spiderdevil Points 386

Il y a quelque temps, j'ai écrit cet outil https://bitbucket.org/surenrao/xml2json pour mon application TV Watchlist, j'espère que cela vous aidera aussi.

Synopsys : Une bibliothèque qui non seulement convertit xml en json, mais qui est aussi facile à déboguer (sans erreurs circulaires) et à recréer json en xml. Caractéristiques :- Analyse xml en objet json. Imprime l'objet json en xml. Peut être utilisé pour sauvegarder xml dans IndexedDB comme objets X2J. Imprimer l'objet json.

0 votes

@kleopatra ce lien pointe vers l'outil qui convertit le xml en json. Il ne s'agit pas d'une référence mais du lien réel vers la ressource. Je ne sais pas comment le faire autrement :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X