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ı?
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ı?
Yanıtlar:
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.
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);
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.
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.
Ş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 !
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);
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);
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
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
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ı:
<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.
İ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