Javascript kullanarak XML'i JSON'a (ve geri) dönüştürme


145

XML'den JSON'a ve sonra tekrar XML'e nasıl dönüştürebilirsiniz?

Aşağıdaki araçlar oldukça iyi çalışır, ancak tamamen tutarlı değildir:

Daha önce bu durumla karşılaşan var mı?


8
Tutarsızlıkları açıklayınız, lütfen
Josh Stodola

4
Özellikle, sadece 1 elementli JSON dizilerini XML'e dönüştürmekle ilgiliydi. 1 öğeli bir dizi yerine tekrar JSON'a dönüştürdüğünüzde, değişmez nesneyi oluşturdu. Ben $ .isArray () ile türü kontrol ederek ve! $. İsArray () ise bir diziye sarılarak etrafında çalıştı.
Jason Suárez

1
xml2json - fyneworks.com/jquery/xml-to-json - breaks throws 500 as of 15/02/2013 14:25 AEST
ysrb

The json2xml link is broken.
whirlwin

@ysrb Eklenti örneği IE8'de çalışmaz!
ahbap

Yanıtlar:


103

Bence bu en iyisi: XML ve JSON arasında dönüştürme

Bu dönüşümlerle ilgili sorunların ayrıntılarına giren xml.com O'Reilly sitesinde , aydınlatıcı bulacağınız makaleyi mutlaka okuyun . O'Reilly'nin makaleye ev sahipliği yapması, Stefan'ın çözümünün haklı olduğunu göstermelidir.


Cevap için teşekkürler! Benim durumumda, JSON kanonik temsilidir ve XML sadece XSLT için kullanılır .. kullanımı benim fikrim değil! :)
Jason Suárez

Bu sadece tarayıcıda. Node.js veya tarayıcı dışı ortamlar için geçerli değildir. Başka fikir var mı?
Homer6

1
@JasonDenizac'ın gönderisine yaptığı yorum ile ilgili olarak, bu bağlantının bir öğeden oluşan bir dizi yerine bir nesneye sahip olma sorununu düzeltmeye nasıl yardımcı olduğunu anlayamıyorum ...
guiomie

1
Json-xml-json'dan başlarsanız, bu kütüphane iyi çalışır, ancak xml-json-xml istiyorsanız, <o> ve <e> gibi meta veri xml öğeleri eklediğinden tersinirlikle ilgili bir sorun olduğunu
gördüm

3
Bunun copyleft lisanslı bir çözüm olduğunu lütfen unutmayın. Yalnızca açık kaynaklı yazılım yazarken bir seçenektir.
Jasper

48

https://github.com/abdmob/x2js - kendi kütüphanem ( http://code.google.com/p/x2js/ adresinden güncellenen URL ):

Bu kütüphane XML'den JSON'a (JavaScript Nesneleri) ve tersi olarak javascript dönüştürme işlevlerini sağlar. Kütüphane çok küçüktür ve başka ek kütüphane gerektirmez.

API işlevleri

  • new X2JS () - tüm kütüphane işlevlerine erişecek örneğinizi oluşturmak için. Ayrıca burada isteğe bağlı yapılandırma seçeneklerini belirtebilirsiniz
  • X2JS.xml2json - DOM Nesnesi olarak belirtilen XML'yi JSON'a dönüştür
  • X2JS.json2xml - JSON'u XML DOM Nesnesine Dönüştür
  • X2JS.xml_str2json - Dize olarak belirtilen XML'yi JSON'a dönüştür
  • X2JS.json2xml_str - JSON'u XML dizesine dönüştür

Çevrimiçi Demo 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
Merhaba, bir nesnede tek bir nesne varsa nesne litteral olduğu, n> 1 nesne varsa, bir dizi var nerede sorunu aştı. Bu şablonlarda nesneleri json için xml kullanmayı zorlaştırır ...
guiomie

Evet, biraz hile yapmalısınız ve bu XML yapısı hakkındaki bilginize bağlıdır (çünkü burada XSD yoktur). Düğümünüze her zaman dizi (dizi) olarak erişmek için <node> ... <node> _asArray sözdizimini kullanın
abdolence

1
Örnek: // JSON'a XML dizesi var xmlText = "<MyOperation> <test> Başarı </test> <test2> <item> ddsfg </item> <item> dsdgfdgfd </item> </test2> </MyOperation> "; var jsonObj = X2JS.xml_str2json (xmlText); uyarı (jsonObj.MyOperation.test); alert (jsonObj.MyOperation.test_asArray [0]);
abdolence

Benim asıl sorun, benim json benim xml geri dönüştürmek, json ekstra özelliklerle dolu ve xml dize tüm yararsız şeyler tutar zaman. Her türlü virgül ve beyaz boşluklara sahiptir ...
guiomie

Numunenizi code.google.com/p/x2js/issues adresine gönderir misiniz kontrol edeceğim
abdolence

25

Bu cevaplar bu işlevi yapmamda bana çok yardımcı oldu:

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

Bir jquery dom / xml nesnesinde geçtiğiniz sürece: benim için:

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

nerede içerik Ben benim xml depolamak edildi tarla idi.


3

Bir süre önce TV Watchlist uygulamam için bu aracı https://bitbucket.org/surenrao/xml2json yazdım , umarım bu da yardımcı olur.

Synopsys: Sadece xml'yi json'a dönüştürmekle kalmayıp aynı zamanda hata ayıklamak (dairesel hatalar olmadan) ve json'u tekrar xml'ye yeniden oluşturmak için bir kütüphane. Özellikler: - Json nesnesine xml ayrıştırma. Json nesnesini tekrar xml'ye yazdırın. IndexedDB'de xml'yi X2J nesneleri olarak kaydetmek için kullanılabilir. Json nesnesini yazdırın.


@kleopatra bu bağlantı xml'yi json'a dönüştüren araca işaret eder. Bu bir referans değil, kaynağa gerçek bağlantı. Başka nasıl yapmalıyım emin değilim :)
surya

2

Şahsen bu aracı tavsiye ederim . XML'den JSON'a dönüştürücüdür.

Çok hafif ve saf JavaScript içeriyor. Hiçbir bağımlılığa ihtiyacı yoktur. İşlevleri kodunuza ekleyebilir ve istediğiniz gibi kullanabilirsiniz.

XML özniteliklerini de dikkate alır.

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”}}’

İşte bir çevrimiçi demo !


4
github repo bulunamadı
brauliobo

1

Feragatname: fast-xml-parser yazdım

Hızlı XML Ayrıştırıcı XML JSON ve tersi dönüştürmek için yardımcı olabilir. İşte örnek;

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

JSON veya JS nesnesini XML olarak ayrıştırmak istiyorsanız

//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, XML 2 JSON dönüştürücüsünden daha fazlasıdır. Lütfen benioku olup olmadığını kontrol edin.
Amit Kumar Gupta

1

Burada , xml <-> js dönüşümlerini çok iyi yapan belgelenmiş ve çok ünlü bir npm kütüphanesinden iyi bir araç: yukarıda önerilen çözümlerin bazılarından (belki hepsinden) farklı olarak, xml yorumlarını da dönüştürür.

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

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

1

6 basit ES6 satırında:

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                                                                                                                                                              
}  

Https://github.com/brauliobo/biochemical-db/blob/master/lib/xml2json.es6 adresindeecho "xml2json_example()" | node -r xml2json.es6 kaynakla test edin


0

Ben sadece xml tek bir değer elde etmek için xmlToJson kullanıyordum.
Aşağıdaki yapmak çok daha kolay bulundu (xml sadece bir kez oluşursa ..)

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

Kütüphane kurmak ve olanların arkasındaki mantığı anlamak istemiyorsanız, regex tabanlı bir özyinelemeli işlev oluşturdum:

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

Her döngü için normal ifade açıklaması:

  • res [0] - xml'yi (olduğu gibi) döndür
  • res [1] - xml etiketinin adını döndürür
  • res [2] - xml içeriğini döndür
  • res [3] - etiketin kendisini kapatması durumunda xml etiket adını döndürür. Örnek olarak:<tag />

Normal ifadenin nasıl çalıştığını buradan kontrol edebilirsiniz: https://regex101.com/r/ZJpCAL/1

Not: json'un tanımlanmamış bir değere sahip bir anahtarı varsa, kaldırılır. Bu yüzden 9. satırın sonuna null değer ekledim.


-2

İstemci tarafı olarak sunucu tarafı kullanarak bunu yapmanın en iyi yolu tüm senaryolarda iyi sonuç vermez. Çevrimiçi json xml ve xml json dönüştürücü javascript kullanarak inşa etmeye çalışıyordu ve tüm senaryolarda çalışmadığı gibi neredeyse imkansız hissettim. Sonuçta ASP.MVC Newtonsoft kullanarak sunucu tarafı yapıyor sona erdi. İşte çevrimiçi dönüştürücü http://techfunda.com/Tools/XmlToJson

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.