使用 Javascript 将 XML 转换为 JSON(并返回)
我认为这是最好的: Converting between XML and JSON
请务必阅读xml.com O'Reilly 站点上随附的文章,其中详细介绍了这些转换的问题,我认为您会从中得到启发。O'Reilly 主持这篇文章的事实应该表明 Stefan 的解决方案是有value的。
https://github.com/abdmob/x2js - 我自己的库(来自http://code.google.com/p/x2js/ 的更新 URL ):
该库提供 XML 到 JSON(JavaScript 对象),反之亦然 javascript 转换功能。该库非常小,不需要任何其他额外的库。
API函数
- new X2JS() - 创建您的实例以访问所有库功能。您也可以在此处指定可选配置选项
- X2JS.xml2json - 将指定为 DOM 对象的 XML 转换为 JSON
- X2JS.json2xml - 将 JSON 转换为 XML DOM 对象
- 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]
其中content是我存储 xml 的字段。
不久前,我为我的 TV Watchlist 应用编写了这个工具https://bitbucket.org/surenrao/xml2json,希望这也能有所帮助。
Synopsys:一个库,不仅可以将 xml 转换为 json,而且还易于调试(没有循环错误)并将 json 重新创建回 xml。特点:- 将 xml 解析为 json 对象。将 json 对象打印回 xml。可用于将 IndexedDB 中的 xml 保存为 X2J 对象。打印 json 对象。
我已经创建了一个基于正则表达式的递归函数,以防您不想安装库并了解发生的事情背后的逻辑:
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;
}
每个循环的正则表达式解释:
- res[0] - 返回 xml(原样)
- res[1] - 返回 xml 标签名称
- res[2] - 返回 xml 内容
- res[3] - 返回 xml 标签名称,以防标签自行关闭。例如:
<tag />
您可以在此处查看正则表达式的工作原理:https : //regex101.com/r/ZJpCAL/1
注意:如果 json 有一个未定义值的键,它将被删除。这就是我在第 9 行末尾插入 null 的原因。