Bagaimana Anda mengkonversi dari XML ke JSON dan kemudian kembali ke XML?
Alat-alat berikut bekerja dengan baik, tetapi tidak sepenuhnya konsisten:
Adakah yang pernah mengalami situasi ini sebelumnya?
Bagaimana Anda mengkonversi dari XML ke JSON dan kemudian kembali ke XML?
Alat-alat berikut bekerja dengan baik, tetapi tidak sepenuhnya konsisten:
Adakah yang pernah mengalami situasi ini sebelumnya?
Jawaban:
Saya pikir ini yang terbaik: Mengubah antara XML dan JSON
Pastikan untuk membaca artikel yang menyertainya di situs O'Reilly xml.com , yang membahas detail masalah dengan konversi ini, yang saya pikir Anda akan menemukan pencerahan. Fakta bahwa O'Reilly menjadi tuan rumah artikel itu harus menunjukkan bahwa solusi Stefan pantas.
https://github.com/abdmob/x2js - perpustakaan saya sendiri (URL yang diperbarui dari http://code.google.com/p/x2js/ ):
Perpustakaan ini menyediakan fungsi XML ke JSON (Objek JavaScript) dan sebaliknya konversi javascript. Perpustakaannya sangat kecil dan tidak memerlukan perpustakaan tambahan lainnya.
Fungsi API
- X2JS baru () - untuk membuat instance Anda untuk mengakses semua fungsi perpustakaan. Anda juga dapat menentukan opsi konfigurasi opsional di sini
- X2JS.xml2json - Konversi XML ditetapkan sebagai DOM Object ke JSON
- X2JS.json2xml - Konversi JSON ke Objek XML DOM
- X2JS.xml_str2json - Konversi XML yang ditentukan sebagai string ke JSON
- X2JS.json2xml_str - Konversi JSON ke string XML
Demo Online di 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);
Jawaban-jawaban ini banyak membantu saya untuk membuat fungsi ini:
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);
}
}
Selama Anda melewati objek jquery dom / xml: bagi saya itu adalah:
Jquery(this).find('content').eq(0)[0]
di mana konten adalah bidang tempat saya menyimpan xml saya.
Beberapa waktu yang lalu saya menulis alat ini https://bitbucket.org/surenrao/xml2json untuk aplikasi TV Daftartonton saya, semoga ini membantu juga.
Sinopsis: Pustaka untuk tidak hanya mengkonversi xml ke json, tetapi juga mudah untuk debug (tanpa kesalahan melingkar) dan membuat kembali json kembali ke xml. Fitur: - Parse objek xml ke json. Cetak objek json kembali ke xml. Dapat digunakan untuk menyimpan xml di IndexedDB sebagai objek X2J. Cetak objek json.
Saya pribadi akan merekomendasikan alat ini . Ini adalah konverter XML ke JSON.
Ini sangat ringan dan dalam JavaScript murni. Tidak perlu dependensi. Anda cukup menambahkan fungsi ke kode Anda dan menggunakannya sesuai keinginan.
Ini juga mempertimbangkan atribut 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”}}’
Ini demo online !
Penafian: Saya sudah menulis fast-xml-parser
Parser XML cepat dapat membantu untuk mengkonversi XML ke JSON dan sebaliknya. Inilah contohnya;
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);
}
Jika Anda ingin mem-parsing objek JSON atau JS ke XML maka
//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);
Berikut ini alat yang bagus dari pustaka npm yang terdokumentasi dan sangat terkenal yang melakukan konversi xml <-> js dengan sangat baik: berbeda dari beberapa (mungkin semua) solusi yang diusulkan di atas, ia juga mengkonversi komentar xml.
var obj = {name: "Super", Surname: "Man", age: 23};
var builder = new xml2js.Builder();
var xml = builder.buildObject(obj);
Dalam 6 garis ES6 sederhana:
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
}
Uji dengan echo "xml2json_example()" | node -r xml2json.es6
dengan sumber di https://github.com/brauliobo/biochemical-db/blob/master/lib/xml2json.es6
Saya menggunakan xmlToJson hanya untuk mendapatkan satu nilai xml.
Saya menemukan melakukan hal berikut ini jauh lebih mudah (jika xml hanya terjadi sekali ..)
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
Saya telah membuat fungsi rekursif berdasarkan regex, jika Anda tidak ingin menginstal perpustakaan dan memahami logika di balik apa yang terjadi:
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;
}
Penjelasan regex untuk setiap loop:
<tag />
Anda dapat memeriksa cara kerja regex di sini: https://regex101.com/r/ZJpCAL/1
Catatan: Dalam kasus json memiliki kunci dengan nilai yang tidak ditentukan, itu sedang dihapus. Itu sebabnya saya memasukkan nol di akhir baris 9.
Cara terbaik untuk melakukannya menggunakan sisi server karena sisi klien tidak berfungsi dengan baik di semua skenario. Saya mencoba membangun json to xml dan xml to json converter online menggunakan javascript dan saya merasa hampir tidak mungkin karena tidak berfungsi di semua skenario. Akhirnya saya akhirnya melakukannya di sisi server menggunakan Newtonsoft di ASP.MVC. Inilah konverter online http://techfunda.com/Tools/XmlToJson