Làm thế nào bạn sẽ chuyển đổi từ XML sang JSON và sau đó trở lại XML?
Các công cụ sau hoạt động khá tốt, nhưng không hoàn toàn nhất quán:
Có ai gặp phải tình huống này trước đây?
Làm thế nào bạn sẽ chuyển đổi từ XML sang JSON và sau đó trở lại XML?
Các công cụ sau hoạt động khá tốt, nhưng không hoàn toàn nhất quán:
Có ai gặp phải tình huống này trước đây?
Câu trả lời:
Tôi nghĩ đây là cách tốt nhất: Chuyển đổi giữa XML và JSON
Hãy chắc chắn đọc bài viết kèm theo trên trang web xml.com O'Reilly , trong đó đi sâu vào chi tiết về các vấn đề với các chuyển đổi này, mà tôi nghĩ bạn sẽ thấy giác ngộ. Việc O'Reilly đang lưu trữ bài báo sẽ chỉ ra rằng giải pháp của Stefan có giá trị.
https://github.com/abdmob/x2js - thư viện của riêng tôi (URL được cập nhật từ http://code.google.com.vn/p/x2js/ ):
Thư viện này cung cấp XML sang JSON (Đối tượng JavaScript) và ngược lại các hàm chuyển đổi javascript. Thư viện rất nhỏ và không yêu cầu bất kỳ thư viện bổ sung nào khác.
Các hàm API
- X2JS () mới - để tạo phiên bản của bạn để truy cập tất cả các chức năng của thư viện. Ngoài ra, bạn có thể chỉ định các tùy chọn cấu hình tùy chọn ở đây
- X2JS.xml2json - Chuyển đổi XML được chỉ định làm Đối tượng DOM thành JSON
- X2JS.json2xml - Chuyển đổi đối tượng JSON thành XML DOM
- X2JS.xml_str2json - Chuyển đổi XML được chỉ định dưới dạng chuỗi thành JSON
- X2JS.json2xml_str - Chuyển đổi chuỗi JSON thành XML
Bản demo trực tuyến trên 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);
Những câu trả lời này đã giúp tôi rất nhiều để thực hiện chức năng này:
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);
}
}
Miễn là bạn vượt qua trong một đối tượng jquery dom / xml: đối với tôi đó là:
Jquery(this).find('content').eq(0)[0]
trong đó nội dung là lĩnh vực tôi đang lưu trữ xml của mình.
Một thời gian trước tôi đã viết công cụ này https://bitbucket.org/surenrao/xml2json cho ứng dụng Danh sách theo dõi trên TV của tôi, hy vọng điều này cũng có ích.
Tóm tắt nội dung: Một thư viện không chỉ chuyển đổi xml thành json mà còn dễ dàng gỡ lỗi (không có lỗi hình tròn) và tạo lại json trở lại xml. Các tính năng: - Phân tích xml đối tượng json. In đối tượng json trở lại xml. Có thể được sử dụng để lưu xml trong IndexedDB dưới dạng đối tượng X2J. In đối tượng json.
Cá nhân tôi muốn giới thiệu công cụ này . Nó là một trình chuyển đổi XML sang JSON.
Nó rất nhẹ và ở dạng JavaScript thuần túy. Nó không cần phụ thuộc. Bạn có thể chỉ cần thêm các chức năng vào mã của bạn và sử dụng nó như bạn muốn.
Nó cũng đưa các thuộc tính XML vào các cân nhắc.
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”}}’
Đây là một bản demo trực tuyến !
Tuyên bố miễn trừ trách nhiệm: Tôi đã viết trình phân tích cú pháp nhanh xml
Trình phân tích cú pháp XML nhanh có thể giúp chuyển đổi XML sang JSON và ngược lại. Đây là ví dụ;
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);
}
Nếu bạn muốn phân tích đối tượng JSON hoặc JS thành XML thì
//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);
Đây là một công cụ tốt từ thư viện npm được ghi lại và rất nổi tiếng, chuyển đổi xml <-> js rất tốt: khác với một số (có thể là tất cả) các giải pháp được đề xuất ở trên, nó cũng chuyển đổi các nhận xét xml.
var obj = {name: "Super", Surname: "Man", age: 23};
var builder = new xml2js.Builder();
var xml = builder.buildObject(obj);
Trong 6 dòng ES6 đơn giản:
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
}
Kiểm tra với echo "xml2json_example()" | node -r xml2json.es6
nguồn tại https://github.com/bAFiobo/biochemical-db/blob/master/lib/xml2json.es6
Tôi đã sử dụng xmlToJson chỉ để nhận một giá trị duy nhất của xml.
Tôi thấy việc thực hiện sau đây dễ dàng hơn nhiều (nếu xml chỉ xảy ra một lần ..)
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
Tôi đã tạo một hàm đệ quy dựa trên regex, trong trường hợp bạn không muốn cài đặt thư viện và hiểu logic đằng sau những gì đang xảy ra:
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 giải thích cho mỗi vòng lặp:
<tag />
Bạn có thể kiểm tra cách regex hoạt động tại đây: https://regex101.com/r/ZJpCAL/1
Lưu ý: Trong trường hợp json có khóa có giá trị không xác định, nó sẽ bị xóa. Đó là lý do tại sao tôi đã chèn null ở cuối dòng 9.
Cách tốt nhất để làm điều đó bằng cách sử dụng phía máy chủ vì phía máy khách không hoạt động tốt trong tất cả các tình huống. Tôi đã cố gắng xây dựng trình chuyển đổi json trực tuyến sang xml và xml sang json bằng javascript và tôi cảm thấy gần như không thể vì nó không hoạt động trong tất cả các tình huống. Cuối cùng, tôi đã kết thúc việc thực hiện phía máy chủ bằng Newtonsoft trong ASP.MVC. Đây là công cụ chuyển đổi trực tuyến http://techfunda.com/Tools/XmlToJson