使用 Javascript 将 XML 转换为 JSON (然后返回)

如何将 XML 转换为 JSON,然后再转换回 XML?

下列工具工作得很好,但并不完全一致:

以前有人遇到过这种情况吗?

508326 次浏览

我认为这是最好的一个: 在 XML 和 JSON 之间转换

一定要阅读 在 xml.com O’Reilly 网站上发表了一篇相关文章,其中详细介绍了这些转换的问题,我认为你会发现启发。O’Reilly 主持这篇文章的事实应该表明 Stefan 的解决方案是有价值的。

Https://github.com/abdmob/x2js -我自己的图书馆(来自 http://code.google.com/p/x2js/的更新网址) :

这个库提供 XML 到 JSON (JavaScript 对象)的转换函数,反之亦然。这个库非常小,不需要任何其他的库。

API 函数

  • New X2JS ()-创建实例以访问所有库功能
  • Xml2json-将指定为 DOM 对象的 XML 转换为 JSON
  • Json2xml-将 JSON 转换为 XML DOM 对象
  • XML _ str2json-将指定为字符串的 XML 转换为 JSON
  • 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);

不久前,我为我的电视观察列表应用程序写了这个工具 https://bitbucket.org/surenrao/xml2json,希望这也有帮助。

Synopsys: 这个库不仅可以将 xml 转换为 json,还可以很容易地进行调试(不会出现循环错误) ,并将 json 重新创建回 xml。特性:-将 xml 解析为 json 对象。将 json 对象打印回 xml。可用于在 IndexedDB 中将 xml 保存为 X2J 对象。打印 json 对象。

这些答案很大程度上帮助我实现了这个功能:

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 的字段。

使用服务器端作为客户端的最佳方法并不适用于所有场景。我试图用 javascript 构建在线 json to xml 和 xml to json 转换器,但是我觉得几乎不可能,因为它不能在所有场景中工作。最终,我在 ASP.MVC 中使用 Newton 在服务器端完成了这项工作。这是在线转换器 http://techfunda.com/Tools/XmlToJson

我个人推荐 这个工具,它是一个 XML 到 JSON 的转换器。

它非常轻量级,而且是纯 JavaScript。它不需要依赖。您可以简单地将这些函数添加到代码中,并根据自己的需要使用它们。

它还考虑到 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

快速 XML 解析器可以帮助将 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);

我使用 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

在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

我已经创建了一个基于正则表达式的递归函数,如果你不想安装库并理解背后的逻辑发生了什么:

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 标记名称,以防标记自动关闭

您可以在这里查看 regex 的工作原理: Https://regex101.com/r/zjpcal/1

注意: 如果 json 有一个带有未定义值的键,那么它将被删除。 这就是我在第9行末尾插入 null 的原因。

也可以使用 Txml。它可以解析成由简单对象组成的 DOM 并进行字符串化。在结果中,内容将被修剪。因此,使用空格的原始格式将丢失。但是这可以很好地用于缩小 HTML。

const xml = require('txml');
const data = `
<tag>tag content</tag>
<tag2>another content</tag2>
<tag3>
<insideTag>inside content</insideTag>
<emptyTag />
</tag3>`;


const dom = xml(data); // the dom can be JSON.stringified


xml.stringify(dom); // this will return the dom into an xml-string

免责声明: 我是 Txml的作者,它是 javascript 中最快的 xml 解析器。