JavaScript中XML转JSON遇DOMParser解析异常,求解决方案
XML转JSON解析异常的解决方法
问题重现
我有一段XML格式的字符串,想要转成JSON格式,尝试了以下代码:
var string_xml = "<automaton><type>AFD</type><sigma>ab,01</sigma></automaton" var parser = new DOMParser(); var xmlDoc = parser.parseFromString(string_xml,"text/xml"); JSON.stringify(xmlToJson2(xmlDoc));
但调用parseFromString时解析失败,无法得到正常的XML文档,希望用下面的xmlToJson2函数完成转换:
function xmlToJson2(xml) { // Create the return object //var obj = {}; var obj="{}" // console.log(xml.nodeType, xml.nodeName ); if (xml.nodeType == 1) { // element // do attributes if (xml.attributes.length > 0) { obj["@attributes"] = {}; for (var j = 0; j < xml.attributes.length; j++) { var attribute = xml.attributes.item(j); console.log(attribute); obj["@attributes"][attribute.nodeName] = attribute.nodeValue; } } } else if (xml.nodeType == 3 || xml.nodeType == 4) { // text and cdata section obj = xml.nodeValue } // do children if (xml.hasChildNodes()) { for(var i = 0; i < xml.childNodes.length; i++) { var item = xml.childNodes.item(i); var nodeName = item.nodeName; if (typeof(obj[nodeName]) == "undefined") { obj[nodeName] = xmlToJson2(item); } else { if (typeof(obj[nodeName].length) == "undefined") { var old = obj[nodeName]; obj[nodeName] = []; obj[nodeName].push(old); } if (typeof(obj[nodeName]) === 'object') { obj[nodeName].push(xmlToJson2(item)); } } } } return obj; }
问题原因及修复方案
1. XML字符串语法错误
你的XML字符串末尾的<automaton>标签未闭合,缺少结尾的>,正确的XML字符串应为:
var string_xml = "<automaton><type>AFD</type><sigma>ab,01</sigma></automaton>"
标签不闭合会导致DOMParser解析失败,生成包含错误信息的XML文档,而非预期的结构。
2. xmlToJson2函数初始化错误
函数中把obj初始化为字符串"{}",字符串无法直接添加键值对,会导致后续逻辑失效,需要改为初始化空对象:
var obj = {};
直接替换掉原代码中的var obj="{}"即可。
修复后的完整代码
var string_xml = "<automaton><type>AFD</type><sigma>ab,01</sigma></automaton>" var parser = new DOMParser(); var xmlDoc = parser.parseFromString(string_xml,"text/xml"); function xmlToJson2(xml) { var obj = {}; if (xml.nodeType == 1) { // element if (xml.attributes.length > 0) { obj["@attributes"] = {}; for (var j = 0; j < xml.attributes.length; j++) { var attribute = xml.attributes.item(j); obj["@attributes"][attribute.nodeName] = attribute.nodeValue; } } } else if (xml.nodeType == 3 || xml.nodeType == 4) { // text and cdata section obj = xml.nodeValue.trim(); // 可选:去除文本节点多余空白 } if (xml.hasChildNodes()) { for(var i = 0; i < xml.childNodes.length; i++) { var item = xml.childNodes.item(i); var nodeName = item.nodeName; if (typeof(obj[nodeName]) == "undefined") { obj[nodeName] = xmlToJson2(item); } else { if (typeof(obj[nodeName].length) == "undefined") { var old = obj[nodeName]; obj[nodeName] = [old]; } obj[nodeName].push(xmlToJson2(item)); } } } return obj; } // 传入根节点而非整个xmlDoc,避免包含XML声明等额外节点 console.log(JSON.stringify(xmlToJson2(xmlDoc.documentElement)));
测试结果
修复后运行代码,会得到预期的JSON结果:
{"type":"AFD","sigma":"ab,01"}
内容的提问来源于stack exchange,提问作者mpy
相关产品推荐
相关产品推荐

