คุณจะแปลงจาก XML เป็น JSON แล้วกลับเป็น XML ได้อย่างไร
เครื่องมือต่อไปนี้ทำงานได้ค่อนข้างดี แต่ไม่สอดคล้องกันทั้งหมด:
มีใครเคยเจอสถานการณ์นี้มาก่อนหรือไม่
คุณจะแปลงจาก XML เป็น JSON แล้วกลับเป็น XML ได้อย่างไร
เครื่องมือต่อไปนี้ทำงานได้ค่อนข้างดี แต่ไม่สอดคล้องกันทั้งหมด:
มีใครเคยเจอสถานการณ์นี้มาก่อนหรือไม่
คำตอบ:
ฉันคิดว่านี่เป็นสิ่งที่ดีที่สุด: การ แปลงระหว่าง XML และ JSON
อย่าลืมอ่านบทความประกอบในเว็บไซต์ xml.com O'Reillyซึ่งมีรายละเอียดของปัญหาเกี่ยวกับการแปลงเหล่านี้ซึ่งฉันคิดว่าคุณจะได้รู้แจ้ง ความจริงที่ว่า O'Reilly กำลังโฮสต์บทความควรระบุว่าโซลูชันของ Stefan นั้นมีข้อดี
https://github.com/abdmob/x2js - ห้องสมุดของฉัน (URL ที่อัปเดตจากhttp://code.google.com/p/x2js/ ):
ไลบรารีนี้จัดเตรียม XML ถึง JSON (วัตถุ JavaScript) และฟังก์ชันการแปลง javascript ในทางกลับกัน ห้องสมุดมีขนาดเล็กมากและไม่ต้องการห้องสมุดเพิ่มเติมอื่น ๆ
ฟังก์ชั่น API
- ใหม่ X2JS () - เพื่อสร้างอินสแตนซ์ของคุณเพื่อเข้าถึงฟังก์ชันการทำงานของไลบรารีทั้งหมด นอกจากนี้คุณสามารถระบุตัวเลือกการกำหนดค่าเพิ่มเติมได้ที่นี่
- X2JS.xml2json - แปลง XML ที่ระบุเป็น DOM Object เป็น JSON
- X2JS.json2xml - แปลง JSON เป็น XML DOM Object
- X2JS.xml_str2json - แปลง XML ที่ระบุเป็นสตริงเป็น JSON
- X2JS.json2xml_str - แปลง JSON เป็นสตริง XML
การสาธิตออนไลน์บน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);
คำตอบเหล่านี้ช่วยฉันได้มากในการทำฟังก์ชั่นนี้:
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);
}
}
ตราบใดที่คุณผ่านวัตถุ jquery dom / xml: สำหรับฉันมันคือ:
Jquery(this).find('content').eq(0)[0]
เนื้อหาอยู่ที่ไหนในฟิลด์ที่ฉันเก็บ xml ไว้
ซักพักฉันเขียนเครื่องมือนี้https://bitbucket.org/surenrao/xml2jsonสำหรับแอพ TV Watchlist ของฉันหวังว่ามันจะช่วยได้เช่นกัน
Synopsys: ไลบรารีที่ไม่เพียง แต่แปลง xml เป็น json แต่ยังง่ายต่อการดีบัก (โดยไม่มีข้อผิดพลาดแบบวงกลม) และสร้าง json กลับไปเป็น xml คุณสมบัติ: - แยกวิเคราะห์ XML กับวัตถุ json พิมพ์วัตถุ json กลับไปที่ xml สามารถใช้เพื่อบันทึก xml ใน IndexedDB เป็นวัตถุ X2J พิมพ์วัตถุ json
ผมเองอยากจะแนะนำเครื่องมือนี้ มันเป็นตัวแปลง XML เป็น JSON
มันมีน้ำหนักเบามากและอยู่ในจาวาสคริปต์บริสุทธิ์ มันไม่จำเป็นต้องพึ่งพา คุณสามารถเพิ่มฟังก์ชั่นในรหัสของคุณและใช้งานได้ตามที่คุณต้องการ
นอกจากนี้ยังนำแอตทริบิวต์ 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”}}’
นี่คือตัวอย่างออนไลน์ !
คำเตือน: ฉันเขียนfast-xml-parser
Fast XML Parser สามารถช่วยแปลง XML เป็น JSON และในทางกลับกัน นี่คือตัวอย่าง;
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 หรือวัตถุ JS ลงใน XML แล้ว
//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);
นี่เป็นเครื่องมือที่ดีจากไลบรารี npm ที่มีเอกสารและมีชื่อเสียงซึ่งทำการแปลง xml <-> js ได้เป็นอย่างดี: แตกต่างจากโซลูชันที่นำเสนอข้างต้นบางส่วน (อาจจะทั้งหมด) แปลงความคิดเห็น xml ด้วย
var obj = {name: "Super", Surname: "Man", age: 23};
var builder = new xml2js.Builder();
var xml = builder.buildObject(obj);
ใน 6 สาย ES6 ง่าย ๆ :
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
}
ทดสอบกับecho "xml2json_example()" | node -r xml2json.es6
แหล่งที่มาที่https://github.com/brauliobo/biochemical-db/blob/master/lib/xml2json.es6
ฉันใช้ xmlToJson เพื่อรับค่า xml เพียงค่าเดียว
ฉันพบว่าการทำสิ่งต่อไปนี้ง่ายกว่ามาก (หาก xml เกิดขึ้นเพียงครั้งเดียว .. )
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
ฉันได้สร้างฟังก์ชั่นวนซ้ำโดยใช้ regex ในกรณีที่คุณไม่ต้องการติดตั้งไลบรารี่และทำความเข้าใจกับเหตุผลเบื้องหลังสิ่งที่เกิดขึ้น:
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 สำหรับแต่ละลูป:
<tag />
คุณสามารถตรวจสอบการทำงานของ regex ได้ที่นี่: https://regex101.com/r/ZJpCAL/1
หมายเหตุ: ในกรณีที่ json มีคีย์ที่มีค่าไม่ได้กำหนดจะถูกลบออก นั่นเป็นเหตุผลที่ฉันได้ใส่ null ตอนท้ายบรรทัด 9
วิธีที่ดีที่สุดในการใช้ฝั่งเซิร์ฟเวอร์เนื่องจากฝั่งไคลเอ็นต์ทำงานได้ไม่ดีในทุกสถานการณ์ ฉันพยายามสร้างตัวแปลง json ออนไลน์เป็น xml และ xml เป็นตัวแปลง json โดยใช้ javascript และฉันรู้สึกว่าแทบเป็นไปไม่ได้เพราะมันไม่ได้ทำงานในทุกสถานการณ์ ในที่สุดฉันก็ลงมือทำด้านเซิร์ฟเวอร์โดยใช้ Newtonsoft ใน ASP.MVC นี่คือตัวแปลงออนไลน์http://techfunda.com/Tools/XmlToJson