Konversi XML ke JSON (dan kembali) menggunakan Javascript

145

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?

Jason Suárez
sumber
8
Tolong jelaskan ketidakkonsistenannya
Josh Stodola
4
Secara khusus, harus dilakukan dengan mengubah array JSON hanya dengan 1 elemen ke XML. Ketika Anda mengubahnya kembali ke JSON, alih-alih array 1-elemen, itu menciptakan objek literal. Saya mengatasinya dengan memeriksa tipe dengan $ .isArray (), dan membungkusnya dalam array jika! $. IsArray ().
Jason Suárez
1
xml2json - fyneworks.com/jquery/xml-to-json - istirahat melempar 500 pada 15/02/2013 14:25 AEST
ysrb
Tautan json2xml rusak.
whirlwin
@ysrb Contoh plugin tidak akan berfungsi di IE8!
Bung

Jawaban:

103

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.

Josh Stodola
sumber
Terima kasih balasannya! Dalam kasus saya, JSON adalah representasi kanonik, dan XML hanya digunakan untuk XSLT .. penggunaannya bukan ide saya! :)
Jason Suárez
Ini hanya di browser. Tidak berlaku untuk lingkungan node.js atau non-browser. Ada ide lain?
Homer6
1
Sehubungan dengan komentar @JasonDenizac pada postingannya, saya tidak yakin untuk memahami bagaimana tautan ini membantu memperbaiki masalah memiliki objek alih-alih sebuah array dari satu item ...
guiomie
1
Saya menemukan bahwa jika Anda mulai dari json-xml-json, perpustakaan ini berfungsi dengan baik, tetapi jika Anda ingin xml-json-xml ada masalah dengan reversibilitas karena ia menambahkan elemen
xad
3
Harap dicatat bahwa ini adalah solusi berlisensi copyleft. Ini hanya opsi ketika Anda menulis perangkat lunak open source.
Jasper
48

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);
penculikan
sumber
1
Hai, bagaimana Anda mengatasi masalah di mana jika Anda memiliki satu objek di objek itu di objek litteral, di mana jika ada n> 1 objek, Anda memiliki sebuah array. Ini membuatnya sulit untuk menggunakan objek xml ke json di templat ...
guiomie
Ya, Anda harus menggunakan beberapa trik dan itu tergantung pada pengetahuan Anda tentang struktur XML (karena tidak ada XSD di sini). Gunakan <node> ... <node> _asArray syntax untuk mengakses node Anda selalu sebagai array (urutan)
abdolence
1
Contoh: // string XML ke JSON var xmlText = "<MyOperation> <test> Sukses </test> <test2> <dsem> ddsfg </item> <item> dsdgfdgfd </item> </test2> </MyOperation> "; var jsonObj = X2JS.xml_str2json (xmlText); lansiran (jsonObj.MyOperation.test); lansiran (jsonObj.MyOperation.test_asArray [0]);
penculikan
Masalah utama saya, adalah ketika saya mengubah json saya ke xml kembali, json penuh dengan properti tambahan, dan ketika versi string xml menyimpan semua hal yang tidak berguna. Ia memiliki semua jenis koma, dan ruang putih ...
guiomie
bisakah Anda mengirimkan sampel Anda ke code.google.com/p/x2js/issues saya akan memeriksanya
pembatalan
25

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.

Ryan Conrad
sumber
3

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.

surya
sumber
@kleopatra tautan ini menunjuk ke alat yang mengubah xml ke json. Ini bukan referensi tetapi tautan aktual ke sumber daya. Tidak yakin bagaimana lagi yang harus saya lakukan :)
surya
2

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 !

Samuel Bourgault
sumber
4
github repo tidak ditemukan
brauliobo
1

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);
Amit Kumar Gupta
sumber
: D FXP lebih dari XML 2 JSON converter. Silakan periksa apakah itu readme.
Amit Kumar Gupta
1

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);
SimoneMSR
sumber
1

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.es6dengan sumber di https://github.com/brauliobo/biochemical-db/blob/master/lib/xml2json.es6

brauliobo
sumber
0

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

Nebulosar
sumber
0

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:

  • res [0] - kembalikan xml (sebagaimana adanya)
  • res [1] - mengembalikan nama tag xml
  • res [2] - mengembalikan konten xml
  • res [3] - kembalikan nama tag xml jika tag menutup sendiri. Sebagai contoh:<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.

Hasil karya
sumber
-2

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

Sheo Narayan
sumber