Wie würden Sie von XML nach JSON und dann zurück nach XML konvertieren?
Die folgenden Tools funktionieren recht gut, sind jedoch nicht vollständig konsistent:
Hat jemand diese Situation schon einmal erlebt?
Wie würden Sie von XML nach JSON und dann zurück nach XML konvertieren?
Die folgenden Tools funktionieren recht gut, sind jedoch nicht vollständig konsistent:
Hat jemand diese Situation schon einmal erlebt?
Antworten:
Ich denke, das ist das Beste: Konvertieren zwischen XML und JSON
Lesen Sie unbedingt den begleitenden Artikel auf der xml.com O'Reilly-Website , der Einzelheiten zu den Problemen mit diesen Konvertierungen enthält, die Sie meiner Meinung nach aufschlussreich finden werden. Die Tatsache, dass O'Reilly den Artikel hostet, sollte darauf hinweisen, dass Stefans Lösung ihre Berechtigung hat.
https://github.com/abdmob/x2js - meine eigene Bibliothek (aktualisierte URL von http://code.google.com/p/x2js/ ):
Diese Bibliothek bietet XML für JSON (JavaScript Objects) und umgekehrt JavaScript-Konvertierungsfunktionen. Die Bibliothek ist sehr klein und benötigt keine weiteren zusätzlichen Bibliotheken.
API-Funktionen
- new X2JS () - um Ihre Instanz für den Zugriff auf alle Bibliotheksfunktionen zu erstellen. Sie können hier auch optionale Konfigurationsoptionen angeben
- X2JS.xml2json - Konvertiert als DOM-Objekt angegebenes XML in JSON
- X2JS.json2xml - Konvertiert JSON in ein XML-DOM-Objekt
- X2JS.xml_str2json - Konvertiert als Zeichenfolge angegebenes XML in JSON
- X2JS.json2xml_str - Konvertiert JSON in eine XML-Zeichenfolge
Online-Demo unter 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);
Diese Antworten haben mir sehr geholfen, diese Funktion zu erfüllen:
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);
}
}
Solange Sie ein jquery dom / xml-Objekt übergeben: Für mich war es:
Jquery(this).find('content').eq(0)[0]
Wo Inhalt war das Feld, in dem ich meine XML gespeichert habe.
Vor einiger Zeit habe ich dieses Tool https://bitbucket.org/surenrao/xml2json für meine TV Watchlist App geschrieben. Ich hoffe, das hilft auch.
Synopsys: Eine Bibliothek, die nicht nur XML in JSON konvertiert, sondern auch einfach zu debuggen ist (ohne zirkuläre Fehler) und JSON wieder in XML neu erstellt. Features: - Analysiert XML in JSON-Objekt. Drucken Sie das JSON-Objekt zurück in XML. Kann verwendet werden, um XML in IndexedDB als X2J-Objekte zu speichern. Json-Objekt drucken.
Ich würde dieses Tool persönlich empfehlen . Es ist ein XML-zu-JSON-Konverter.
Es ist sehr leicht und in reinem JavaScript. Es braucht keine Abhängigkeiten. Sie können die Funktionen einfach zu Ihrem Code hinzufügen und nach Ihren Wünschen verwenden.
Dabei werden auch die XML-Attribute berücksichtigt.
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 ist eine Online-Demo !
Haftungsausschluss: Ich habe fast-xml-parser geschrieben
Fast XML Parser kann helfen, XML in JSON zu konvertieren und umgekehrt. Hier ist das Beispiel;
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);
}
Wenn Sie JSON- oder JS-Objekte in XML analysieren möchten, dann
//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);
Hier ist ein gutes Tool aus einer dokumentierten und sehr bekannten npm-Bibliothek, das die XML-Konvertierungen sehr gut ausführt: Anders als einige (möglicherweise alle) der oben vorgeschlagenen Lösungen werden auch XML-Kommentare konvertiert.
var obj = {name: "Super", Surname: "Man", age: 23};
var builder = new xml2js.Builder();
var xml = builder.buildObject(obj);
In 6 einfachen ES6-Zeilen:
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
}
Testen Sie mit echo "xml2json_example()" | node -r xml2json.es6
mit Quelle unter https://github.com/brauliobo/biochemical-db/blob/master/lib/xml2json.es6
Ich habe xmlToJson nur verwendet, um einen einzelnen Wert der XML zu erhalten.
Ich fand es viel einfacher, Folgendes zu tun (wenn die XML nur einmal vorkommt ..)
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
Ich habe eine rekursive Funktion basierend auf Regex erstellt, falls Sie keine Bibliothek installieren und die Logik hinter dem, was passiert, verstehen möchten:
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;
}
Regex-Erklärung für jede Schleife:
<tag />
Sie können hier überprüfen, wie der reguläre Ausdruck funktioniert: https://regex101.com/r/ZJpCAL/1
Hinweis: Falls json einen Schlüssel mit einem undefinierten Wert hat, wird dieser entfernt. Deshalb habe ich am Ende von Zeile 9 null eingefügt.
Der beste Weg, dies auf der Serverseite als Client-Seite zu tun, funktioniert nicht in allen Szenarien. Ich habe versucht, einen Online-Konverter von json zu xml und von xml zu json mit Javascript zu erstellen, und ich fühlte mich fast unmöglich, da dies nicht in allen Szenarien funktionierte. Letztendlich habe ich es serverseitig mit Newtonsoft in ASP.MVC gemacht. Hier ist der Online-Konverter http://techfunda.com/Tools/XmlToJson