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 ?
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 ?
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.
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 ! :)
C'est seulement dans le navigateur. Cela ne s'applique pas à node.js ou aux environnements sans navigateur. D'autres idées ?
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...
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);
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...
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).
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]) ;
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]
où contenu était le champ dans lequel je stockais mon xml.
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 :
<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.
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.
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.
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
0 votes
Le lien json2xml est cassé.
0 votes
@ysrb L'exemple de plugin ne fonctionnera pas dans IE8 !
0 votes
github.com/javadev/xml-to-json Je suis le gardien de la bibliothèque.
0 votes
Avez-vous essayé ? devtoolsonline20190908040816.azurewebsites.net/DevTools/