You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 08:27:13