Convertir XML en JSON (et inversement) en utilisant Javascript

145

Comment convertiriez-vous de 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?

Jason Suárez
la source
8
Expliquez les incohérences, s'il vous plaît
Josh Stodola
4
Plus précisément, il s'agissait de convertir des tableaux JSON avec un seul élément en XML. Lorsque vous l'avez converti en JSON, au lieu d'un tableau à 1 élément, il a créé le littéral d'objet. Je l'ai contourné en vérifiant le type avec $ .isArray () et en l'enveloppant dans un tableau if! $. IsArray ().
Jason Suárez
1
xml2json - fyneworks.com/jquery/xml-to-json - pauses lancers 500 à partir du 15/02/2013 14:25 AEST
ysrb
Le lien json2xml est rompu.
whirlwin
@ysrb L'exemple de plugin ne fonctionnera pas dans IE8!
dude

Réponses:

103

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

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

Josh Stodola
la source
Merci pour la réponse! Dans mon cas, le JSON est la représentation canonique, et XML est juste utilisé pour XSLT .. dont l'utilisation n'est pas mon idée! :)
Jason Suárez
Ceci est uniquement dans le navigateur. Ne s'applique pas aux environnements node.js ou non-navigateur. D'autres idées?
Homer6
1
En ce qui concerne le commentaire de @JasonDenizac sur son message, 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 ...
guiomie
1
J'ai trouvé que si vous partez de json-xml-json, cette bibliothèque fonctionne bien, mais si vous voulez xml-json-xml, il y a un problème de réversibilité car il ajoute des éléments de métadonnées xml comme <o> et <e>
vishr
3
Veuillez noter qu'il s'agit d'une solution sous licence copyleft. Ce n'est une option que lorsque vous écrivez un logiciel open source.
Jasper
48

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

Cette bibliothèque fournit des fonctions de conversion XML vers JSON (objets JavaScript) et vice versa. La 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 afin d'accéder à toutes les fonctionnalités de la bibliothèque. Vous pouvez également spécifier des options de configuration facultatives ici
  • X2JS.xml2json - Convertit 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émo 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);
abdolence
la source
1
Salut, comment avez-vous résolu le problème où si vous avez un objet dans un objet, il est dans l'objet littéral, où s'il y a n> 1 objets, vous avez un tableau. Cela rend difficile l'utilisation de xml pour les objets json dans les modèles ...
guiomie
Oui, vous devriez 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 nœud toujours en tant que tableau (séquence)
abdolence
1
Exemple: // chaîne XML vers JSON var xmlText = "<MyOperation> <test> Success </test> <test2> <item> ddsfg </item> <item> dsdgfdgfd </item> </test2> </MyOperation> "; var jsonObj = X2JS.xml_str2json (xmlText); alert (jsonObj.MyOperation.test); alert (jsonObj.MyOperation.test_asArray [0]);
abdolence
Mon principal problème, c'est que lorsque je transforme mon json en xml, le json est plein de propriétés supplémentaires, et lorsque la version string xml garde toutes les choses inutiles. Il a toutes sortes de virgules et d'espaces ...
guiomie
pouvez-vous envoyer votre échantillon à code.google.com/p/x2js/issues Je vais le vérifier
abdolence
25

Ces réponses m'ont beaucoup aidé à faire 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]

où le contenu était le champ dans lequel je stockais mon XML.

Ryan Conrad
la source
3

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 aide aussi.

Synopsys: Une bibliothèque pour non seulement convertir xml en json, mais est également facile à déboguer (sans erreurs circulaires) et recréer json en xml. Caractéristiques: - Parse xml en objet json. Imprimez l'objet json en xml. Peut être utilisé pour enregistrer du XML dans IndexedDB en tant qu'objets X2J. Imprimer l'objet json.

Surya
la source
@kleopatra ce lien pointe vers l'outil qui convertit xml en json. Ce n'est pas une référence mais le lien réel vers la ressource. Je ne sais pas comment je devrais faire autrement :)
Surya
2

Je recommanderais personnellement cet outil . Il s'agit d'un convertisseur XML vers JSON.

Il est très léger et est en pur JavaScript. Il n'a besoin d'aucune dépendance. Vous pouvez simplement ajouter les fonctions à votre code et l'utiliser comme vous le souhaitez.

Il prend également en compte les attributs XML.

var xml = ‘<person id=”1234 age=”30”><name>John Doe</name></person>’;
var json = xml2json(xml); 

console.log(json); 
// prints ‘{“person”: {“id”: “1234”, “age”: “30”, “name”: “John Doe”}}’

Voici une démo en ligne !

Samuel Bourgault
la source
4
github repo not found
brauliobo
1

Avertissement: j'ai écrit fast-xml-parser

Fast XML Parser peut aider à convertir XML en JSON et vice versa. Voici l'exemple;

var options = {
    attributeNamePrefix : "@_",
    attrNodeName: "attr", //default is 'false'
    textNodeName : "#text",
    ignoreAttributes : true,
    ignoreNameSpace : false,
    allowBooleanAttributes : false,
    parseNodeValue : true,
    parseAttributeValue : false,
    trimValues: true,
    decodeHTMLchar: false,
    cdataTagName: "__cdata", //default is 'false'
    cdataPositionChar: "\\c",
};
if(parser.validate(xmlData)=== true){//optional
    var jsonObj = parser.parse(xmlData,options);
}

Si vous souhaitez analyser un objet JSON ou JS en XML, alors

//default options need not to set
var defaultOptions = {
    attributeNamePrefix : "@_",
    attrNodeName: "@", //default is false
    textNodeName : "#text",
    ignoreAttributes : true,
    encodeHTMLchar: false,
    cdataTagName: "__cdata", //default is false
    cdataPositionChar: "\\c",
    format: false, 
    indentBy: "  ",
    supressEmptyNode: false
};
var parser = new parser.j2xParser(defaultOptions);
var xml = parser.parse(json_or_js_obj);
Amit Kumar Gupta
la source
: D FXP est plus qu'un convertisseur JSON XML 2. Veuillez vérifier que c'est readme.
Amit Kumar Gupta
1

Voici un bon outil d'une bibliothèque npm documentée et très célèbre qui effectue très bien les conversions xml <-> js: différemment de certaines (peut-être toutes) des solutions proposées ci-dessus, il convertit également les commentaires xml.

var obj = {name: "Super", Surname: "Man", age: 23};

var builder = new xml2js.Builder();
var xml = builder.buildObject(obj);
SimoneMSR
la source
1

En 6 lignes simples ES6:

xml2json = xml => {                                                                                                                                                     
  var el = xml.nodeType === 9 ? xml.documentElement : xml                                                                                                               
  var h  = {name: el.nodeName}                                                                                                                                          
  h.content    = Array.from(el.childNodes || []).filter(e => e.nodeType === 3).map(e => e.textContent).join('').trim()                                                  
  h.attributes = Array.from(el.attributes || []).filter(a => a).reduce((h, a) => { h[a.name] = a.value; return h }, {})                                                 
  h.children   = Array.from(el.childNodes || []).filter(e => e.nodeType === 1).map(c => h[c.nodeName] = xml2json(c))                                                    
  return h                                                                                                                                                              
}  

Testez avec la echo "xml2json_example()" | node -r xml2json.es6source sur https://github.com/brauliobo/biochemical-db/blob/master/lib/xml2json.es6

brauliobo
la source
0

J'utilisais xmlToJson juste pour obtenir une valeur unique du xml.
J'ai trouvé que faire ce qui suit est beaucoup plus facile (si le xml ne se produit qu'une seule fois ..)

let xml =
'<person>' +
  ' <id>762384324</id>' +
  ' <firstname>Hank</firstname> ' +
  ' <lastname>Stone</lastname>' +
'</person>';

let getXmlValue = function(str, key) {
  return str.substring(
    str.lastIndexOf('<' + key + '>') + ('<' + key + '>').length,
    str.lastIndexOf('</' + key + '>')
  );
}


alert(getXmlValue(xml, 'firstname')); // gives back Hank

Nébulosar
la source
0

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 Regex pour chaque boucle:

  • res [0] - renvoie le xml (tel quel)
  • res [1] - renvoie le nom de la balise xml
  • res [2] - renvoie le contenu xml
  • res [3] - renvoie le nom de la balise xml au cas où la balise se ferme. Par exemple:<tag />

Vous pouvez vérifier le fonctionnement de l'expression régulière ici: https://regex101.com/r/ZJpCAL/1

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

Chef-d'oeuvre
la source
-2

La meilleure façon de le faire en utilisant le côté serveur comme côté client ne fonctionne pas bien dans tous les scénarios. J'essayais de créer un convertisseur en ligne json vers xml et xml vers json en utilisant javascript et je me sentais presque impossible car cela ne fonctionnait pas dans tous les scénarios. En fin de compte, j'ai fini par le faire côté serveur en utilisant Newtonsoft dans ASP.MVC. Voici le convertisseur en ligne http://techfunda.com/Tools/XmlToJson

Sheo Narayan
la source