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

4voto

Tobias Nickel Points 402

Vous pouvez également utiliser txml . Il est capable d'analyser un DOM composé d'objets simples et de le filtrer. Dans le résultat, le contenu sera rogné. Ainsi, le formatage de l'original avec des espaces sera perdu. Mais cela pourrait être très bien utilisé pour réduire le HTML.

const xml = require('txml');
const data = `
<tag>tag content</tag>
<tag2>another content</tag2>
<tag3>
  <insideTag>inside content</insideTag>
  <emptyTag />
</tag3>`;

const dom = xml(data); // the dom can be JSON.stringified

xml.stringify(dom); // this will return the dom into an xml-string

Disclaimer : Je suis l'auteur de txml le parseur xml le plus rapide en javascript.

1 votes

Il s'agit d'une excellente solution de remplacement pour fast-xml-parser en utilisant simplify qui ne convertit pas les chaînes de caractères en nombres de manière arbitraire (comme "1.0" a 1 o 1. )

2voto

Nebulosar Points 715

J'utilisais xmlToJson juste pour obtenir une seule valeur du xml.
J'ai trouvé que faire ce qui suit est beaucoup plus facile (si le xml ne se produit qu'une 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

1 votes

Continuez le travail ! Cela m'a vraiment aidé !

0 votes

Merci beaucoup pour les encouragements :)

0 votes

Pas de problème ! !! BD

1voto

articlestack Points 965

Avertissement : J'ai écrit analyseur fast-xml

Fast XML Parser peut aider à convertir XML en JSON et vice versa. Voici un 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 voulez analyser JSON ou un objet 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);

0 votes

:D FXP est plus qu'un convertisseur XML 2 JSON. Veuillez consulter son fichier readme.

1voto

SimoneMSR Points 45

Ici ' un bon outil issu d'une bibliothèque npm documentée et très célèbre qui fait 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);

1voto

brauliobo Points 468

En 6 simples lignes 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                                                                                                                                                              
}  

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

9 votes

6 lignes simples, plus 2000 lignes de xml2json

0 votes

@ShortFuse la seule dépendance est xmldom, un parseur xml. Il n'utilise pas xml2json de npm, même si le nom est le même.

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