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?
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?
Risposte:
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.
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);
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.
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.
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 !
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);
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);
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.es6
con fonte su https://github.com/brauliobo/biochemical-db/blob/master/lib/xml2json.es6
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
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:
<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.
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