Converti XML in JSON (e viceversa) utilizzando Javascript


145

Come convertiresti da XML a JSON e poi di nuovo in XML?

I seguenti strumenti funzionano abbastanza bene, ma non sono completamente coerenti:

Qualcuno ha mai incontrato questa situazione prima?


8
Spiega le incoerenze, per favore
Josh Stodola,

4
In particolare, ha avuto a che fare con la conversione di array JSON con solo 1 elemento in XML. Quando lo hai riconvertito in JSON, anziché in un array di 1 elemento, ha creato l'oggetto letterale. Ci ho provato controllando il tipo con $ .isArray () e avvolgendolo in un array se! $. IsArray ().
Jason Suárez,

1
xml2json - fyneworks.com/jquery/xml-to-json - interrompe i tiri 500 al 15/02/2013 alle 14:25 AEST
ysrb

Il collegamento json2xml è interrotto.
Whirlwin,

@ysrb L'esempio del plug-in non funzionerà in IE8!
amico,

Risposte:


103

Penso che questo sia il migliore: la conversione tra XML e JSON

Assicurati di leggere l' articolo di accompagnamento sul sito O'Reilly xml.com , che fornisce informazioni dettagliate sui problemi con queste conversioni, che penso che troverai illuminanti. Il fatto che O'Reilly stia ospitando l'articolo dovrebbe indicare che la soluzione di Stefan ha valore.


Grazie per la risposta! Nel mio caso, JSON è la rappresentazione canonica e XML è solo usato per XSLT .. il cui uso non è una mia idea! :)
Jason Suárez,

Questo è solo nel browser. Non si applica agli ambienti node.js o non browser. Altre idee?
Homer6,

1
Per quanto riguarda il commento di @JasonDenizac al suo post, non sono sicuro di capire come questo link aiuta a risolvere il problema di avere un oggetto invece di una matrice di un elemento ...
guiomie

1
Ho scoperto che se inizi da json-xml-json, questa libreria funziona bene, ma se vuoi xml-json-xml c'è un problema con la reversibilità poiché aggiunge elementi metadati xml come <o> e <e>
vishr

3
Questa è una soluzione con licenza copyleft. È solo un'opzione quando si scrive software open source.
Jasper,

48

https://github.com/abdmob/x2js - la mia libreria (URL aggiornato da http://code.google.com/p/x2js/ ):

Questa libreria fornisce funzioni di conversione da XML a JSON (JavaScript Object) e viceversa javascript. La libreria è molto piccola e non richiede altre librerie aggiuntive.

Funzioni API

  • nuovo X2JS () - per creare la tua istanza per accedere a tutte le funzionalità della libreria. Inoltre è possibile specificare qui opzioni di configurazione opzionali
  • X2JS.xml2json - Converti XML specificato come oggetto DOM in JSON
  • X2JS.json2xml - Converti JSON in oggetto DOM XML
  • X2JS.xml_str2json - Converti XML specificato come stringa in JSON
  • X2JS.json2xml_str - Converte JSON in stringa XML

Demo online su 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);

1
Ciao, come hai superato il problema se un oggetto ha un oggetto in un oggetto letterale, dove se ci sono n> 1 oggetti, hai un array. Questo rende difficile usare xml per oggetti json nei template ...
guiomie,

Sì, dovresti usare qualche trucco e dipende dalle tue conoscenze sulla struttura XML (perché qui non c'è XSD). Usa <nodo> ... <nodo> _as Sintassi dell'array per accedere al tuo nodo sempre come array (sequenza)
abdolence

1
Esempio: // stringa XML per 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]);
abdolenza,

Il mio problema principale è quando trasformo il mio json in xml indietro, il json è pieno di proprietà extra e quando la versione stringa xml mantiene tutte le cose inutili. Ha tutti i tipi di virgole e spazi bianchi ...
guiomie,

potresti inviare il tuo campione a code.google.com/p/x2js/issues lo controllerò
abdolence

25

Queste risposte mi hanno aiutato molto a fare questa funzione:

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

Finché passi in un oggetto jquery dom / xml: per me è stato:

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

dove contenuto era il campo in cui stavo memorizzando il mio XML.


3

Qualche tempo fa ho scritto questo strumento https://bitbucket.org/surenrao/xml2json per la mia app TV Watchlist, spero che anche questo aiuti.

Sinossi: una libreria per convertire non solo xml in json, ma è anche facile eseguire il debug (senza errori circolari) e ricreare json in xml. Caratteristiche: - Analizzare xml all'oggetto json. Stampa l'oggetto json su xml. Può essere utilizzato per salvare XML in IndexedDB come oggetti X2J. Stampa oggetto json.


@kleopatra questo link punta allo strumento che converte xml in json. Non è un riferimento ma l'effettivo collegamento alla risorsa. Non sono sicuro di come altrimenti dovrei farlo :)
surya,

2

Raccomanderei personalmente questo strumento . È un convertitore da XML a JSON.

È molto leggero ed è in puro JavaScript. Non ha bisogno di dipendenze. Puoi semplicemente aggiungere le funzioni al tuo codice e usarlo come desideri.

Prende anche in considerazione gli attributi 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”}}’

Ecco una demo online !


4
repo github non trovato
brauliobo

1

Disclaimer: ho scritto fast-xml-parser

Fast XML Parser può aiutare a convertire XML in JSON e viceversa. Ecco l'esempio;

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

Se si desidera analizzare l'oggetto JSON o JS in XML, allora

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

: D FXP è più del convertitore XML 2 JSON. Si prega di verificare che sia pronto.
Amit Kumar Gupta,

1

Ecco un buon strumento da una libreria npm documentata e molto famosa che fa molto bene le conversioni xml <-> js: diversamente da alcune (forse tutte) delle soluzioni sopra proposte, converte anche i commenti xml.

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

var builder = new xml2js.Builder();
var xml = builder.buildObject(obj);

1

In 6 semplici linee 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                                                                                                                                                              
}  

Prova con echo "xml2json_example()" | node -r xml2json.es6con fonte su https://github.com/brauliobo/biochemical-db/blob/master/lib/xml2json.es6


0

Stavo usando xmlToJson solo per ottenere un singolo valore di xml.
Ho scoperto che fare quanto segue è molto più semplice (se l'xml si verifica solo una volta ..)

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


0

Ho creato una funzione ricorsiva basata su regex, nel caso in cui non si desideri installare la libreria e comprendere la logica dietro ciò che sta accadendo:

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

Spiegazione Regex per ogni ciclo:

  • res [0] - restituisce l'xml (così com'è)
  • res [1] - restituisce il nome del tag xml
  • res [2] - restituisce il contenuto xml
  • res [3] - restituisce il nome del tag xml nel caso in cui il tag si chiuda da solo. Per esempio:<tag />

Puoi controllare come funziona il regex qui: https://regex101.com/r/ZJpCAL/1

Nota: nel caso in cui json abbia una chiave con un valore indefinito, viene rimosso. Ecco perché ho inserito null alla fine della riga 9.


-2

Il modo migliore per farlo utilizzando il lato server come lato client non funziona bene in tutti gli scenari. Stavo cercando di creare un convertitore online da json a xml e da xml a json usando javascript e mi sentivo quasi impossibile in quanto non funzionava in tutti gli scenari. Alla fine ho finito per farlo sul lato server usando Newtonsoft in ASP.MVC. Ecco il convertitore online http://techfunda.com/Tools/XmlToJson

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.