Answers:
我认为这是最好的方法: 在XML和JSON之间转换
一定要阅读xml.com O'Reilly网站上的随附文章,该文章详细介绍了这些转换所带来的问题,我认为您会发现这很有启发性。O'Reilly托管该文章的事实应表明,Stefan的解决方案值得。
https://github.com/abdmob/x2js-我自己的库(来自http://code.google.com/p/x2js/的更新的URL ):
该库提供XML到JSON(JavaScript对象)的功能,反之亦然。该库很小,不需要其他任何库。
API函数
- 新的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]
内容是我存储xml的字段所在的位置。
不久前,我为电视监视列表应用程序编写了此工具https://bitbucket.org/surenrao/xml2json,希望这也能有所帮助。
Synopsys:一个不仅可以将xml转换为json的库,而且还易于调试(没有循环错误)并将json重新创建回xml。特点:-将xml解析为json对象。将json对象打印回xml。可用于将IndexedDB中的xml保存为X2J对象。打印json对象。
我个人会推荐这个工具。这是一个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);
在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
我已经基于正则表达式创建了一个递归函数,以防您不想安装库并了解正在发生的事情的逻辑:
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;
}
每个循环的正则表达式说明:
<tag />
您可以在此处检查正则表达式的工作方式:https : //regex101.com/r/ZJpCAL/1
注意:如果json的键值不确定,则将其删除。这就是为什么我在第9行的末尾插入null的原因。
使用服务器端作为客户端的最佳方法并不是在所有情况下都能正常工作。我试图使用JavaScript将在线json转换为xml,并将xml转换为json转换器,但由于无法在所有情况下都无法正常工作,我感到几乎不可能。最终,我最终在ASP.MVC中使用Newtonsoft在服务器端完成了此工作。这是在线转换器http://techfunda.com/Tools/XmlToJson