Converteer XML naar JSON (en terug) met Javascript

Hoe zou u van XML naar JSON en vervolgens terug naar XML converteren?

De volgende tools werken redelijk goed, maar zijn niet helemaal consistent:

Is iemand deze situatie eerder tegengekomen?


Antwoord 1, autoriteit 100%

Ik denk dat dit de beste is: Converteren tussen XML en JSON

Lees de begeleidend artikel op de xml.com O’Reilly-site, dat ingaat op de details van de problemen met deze conversies, waarvan ik denk dat u dit verhelderend zult vinden. Het feit dat O’Reilly het artikel host, zou erop moeten wijzen dat Stefans oplossing verdiensten heeft.


Antwoord 2, autoriteit 47%

https://github.com/abdmob/x2js– mijn eigen bibliotheek (bijgewerkte URL van http://code.google.com/p/x2js/):

Deze bibliotheek biedt XML naar JSON (JavaScript-objecten) en vice versa Javascript-conversiefuncties. De bibliotheek is erg klein en vereist geen andere extra bibliotheken.

API-functies

  • nieuwe X2JS() – om uw instantie te maken voor toegang tot alle bibliotheekfunctionaliteit. U kunt hier ook optionele configuratie-opties opgeven
  • X2JS.xml2json – Converteer XML gespecificeerd als DOM Object naar JSON
  • X2JS.json2xml – Converteer JSON naar XML DOM-object
  • X2JS.xml_str2json – Converteer XML gespecificeerd als string naar JSON
  • X2JS.json2xml_str – Converteer JSON naar XML-tekenreeks

Online demo op 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);

Antwoord 3, autoriteit 25%

Deze antwoorden hebben me enorm geholpen om deze functie te maken:

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);
  }
}

Zolang je een jQuery dom/xml-object doorgeeft: voor mij was het:

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

waar contenthet veld was waarin ik mijn xml opsloeg.


Antwoord 4, autoriteit 4%

Een tijdje terug, schreef ik deze tool https://bitbucket.org/surenrao/xml2json voor mijn Tv-watchlist-app, hoop dat dit ook helpt.

Synopsys: een bibliotheek om niet alleen XML naar JSON te converteren, maar is ook eenvoudig om (zonder circulaire fouten) te debuggen en JSON terug te reiken naar XML. Kenmerken: – Parse XML naar JSON-object. Print JSON-object terug naar XML. Kan worden gebruikt om XML in IndexedDB op te slaan als X2J-objecten. Print JSON-object.


Antwoord 5, Autoriteit 3%

Ik heb een recursieve functie gemaakt op basis van regex, voor het geval u geen bibliotheek wilt installeren en de logica achter begrijpt wat er gebeurt:

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;
}

Antwoord 6, Autoriteit 3%

Je kunt ook txmlgebruiken. Het kan ontleden in een DOM gemaakt van eenvoudige objecten en stringify. In het resultaat wordt de inhoud bijgesneden. De opmaak van het origineel met spaties gaat dus verloren. Maar dit zou heel goed kunnen worden gebruikt om HTML te verkleinen.

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: ik ben de auteur van txml, de snelste xml-parser in javascript.


Antwoord 7, autoriteit 2%

Ik zou persoonlijk deze toolaanbevelen. Het is een XML naar JSON-converter.

Het is erg licht van gewicht en is in puur JavaScript. Het heeft geen afhankelijkheden nodig. U kunt eenvoudig de functies aan uw code toevoegen en deze gebruiken zoals u dat wilt.

Het houdt ook rekening met de XML-attributen.

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”}}’

Hier is een online demo!


Antwoord 8

Disclaimer: ik heb fast-xml-parser

geschreven

Snelle XML-parser kan helpen om XML naar JSON te converteren en vice versa. Hier is het voorbeeld;

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);
}

Als u JSON of JS-object wilt parseren in XML dan

//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);

Antwoord 9

hier ‘een goede tool van een gedocumenteerd en erg beroemd NPM-bibliotheek die de XML & LT; – & GT; JS-conversies Zeer goed: anders dan sommige (misschien alle) van de bovenstaande voorgestelde oplossingen, converteert het XML-opmerkingen ook.

var obj = {name: "Super", Surname: "Man", age: 23};
var builder = new xml2js.Builder();
var xml = builder.buildObject(obj);

Antwoord 10

Ik gebruikte xmlToJson alleen om een enkele waarde van de xml te krijgen.
Ik merkte dat het volgende veel gemakkelijker is (als de xml maar één keer voorkomt…)

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

Antwoord 11

Xml-to-jsonbibliotheek heeft methoden jsonToXml(json)en xmlToJson(xml).

Hier is een online demo!


Antwoord 12

In 6 eenvoudige ES6-regels:

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 met echo "xml2json_example()" | node -r xml2json.es6met bron op https ://github.com/brauliobo/biochemical-db/blob/master/lib/xml2json.es6


Antwoord 13

De beste manier om dit te doen met server-side als client-side werkt niet in alle scenario’s goed. Ik probeerde online json naar xml en xml naar json converter te bouwen met javascript en ik voelde me bijna onmogelijk omdat het niet in alle scenario’s werkte. Uiteindelijk heb ik het server-side gedaan met Newtonsoft in ASP.MVC. Hier is de online converter http://techfunda.com/Tools/XmlToJson

Other episodes