含统一value属性的XML转JSON实现难题及代码求助
解决XML转JSON时提取
value属性值的问题 你的问题很典型——当XML标签的实际数据都存在value属性里时,默认的转换逻辑会把属性嵌套在单独的结构里,导致JSON结构冗余。我帮你调整了转换函数,专门针对这个场景做了优化,直接把value属性的值作为对应字段的内容,而不是保留属性嵌套。
完整可运行代码
var xml = "<Message><id value=\"123\"></id><type value=\"Test\"></type></Message>" var json = XMLtoJSON(xml, ["type", "space", "xmlns", "html"]); var result = JSON.stringify(json) console.log(result); // 输出: {"Message":{"id":"123","type":"Test"}} function XMLtoJSON(xml, ignored) { // 先把字符串XML转为标准DOM对象(兼容浏览器环境) if (typeof xml === 'string') { const parser = new DOMParser(); xml = parser.parseFromString(xml, 'application/xml'); xml = xml.documentElement; } var r = {}; var children = xml.children; var attributes = xml.attributes; var length = children.length; // 核心优化:如果当前节点有value属性且没有子节点,直接返回属性值 const valueAttr = attributes.getNamedItem('value'); if (valueAttr && length === 0) { return valueAttr.value; } // 处理需要忽略的属性,保留其他属性到@attributes(可选) var attrObj = {}; for (var i = 0; i < attributes.length; i++) { var attr = attributes[i]; if (!ignored.includes(attr.name)) { attrObj[attr.name] = attr.value; } } if (Object.keys(attrObj).length > 0) { r['@attributes'] = attrObj; } // 递归处理子节点,支持重复标签转为数组 for (var j = 0; j < length; j++) { var child = children[j]; var childName = child.tagName; var childValue = XMLtoJSON(child, ignored); if (r[childName]) { // 已有同名节点,转为数组 if (!Array.isArray(r[childName])) { r[childName] = [r[childName]]; } r[childName].push(childValue); } else { r[childName] = childValue; } } // 处理节点的文本内容(如果没有value属性且无子女节点) var textContent = xml.textContent.trim(); if (textContent && length === 0 && !valueAttr) { r['#text'] = textContent; } return r; }
关键优化点说明
- 优先提取
value属性:函数会先检查当前节点是否存在value属性,并且没有子节点,此时直接返回该属性的值,避免生成嵌套的@attributes结构。 - 兼容字符串XML输入:新增了字符串转DOM对象的逻辑,不用依赖特定环境的XML语法(比如原代码里的
xml.*)。 - 支持重复标签:如果XML里有多个同名标签(比如多个
<item>),会自动转为数组,防止数据被覆盖。 - 保留忽略属性的功能:原函数的
ignored参数依然生效,会跳过你指定的属性。
额外调整建议
如果你的XML中存在既有value属性又有子节点的情况,当前逻辑会保留@attributes和子节点。如果你希望优先value属性忽略子节点,可以把if (valueAttr && length === 0)改为if (valueAttr)即可。
内容的提问来源于stack exchange,提问作者nkn
相关产品推荐
相关产品推荐

