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?
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?
Réponses:
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.
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);
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.
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.
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 !
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);
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);
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.es6
source sur https://github.com/brauliobo/biochemical-db/blob/master/lib/xml2json.es6
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
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:
<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.
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