XML转JSON脚本id属性丢失问题求助
XML转JSON脚本属性归属问题修复
问题分析
你的脚本能完成基本的XML转JSON,但子元素的属性(比如topic的id)会错误跑到顶级对象里,没归属到对应元素的JSON对象中。
问题根源
原代码里处理子元素属性时,直接把属性塞给了父对象,而不是子元素自身的转换结果:
// 错误逻辑:属性加到父obj,子对象单独赋值 if (item.attributes) for (let attribute of item.attributes) obj[attribute.nodeName] = attribute.nodeValue; obj[nodeName] = xml2js(item);
这种写法导致属性和子对象分离,自然出现在错误的层级。
修复后的代码
调整逻辑:先拿到子元素的转换结果,把属性加到这个子对象上,再赋值给父对象的对应键。同时处理子元素是纯文本的情况,避免属性覆盖文本内容:
function xml2js(xml) { try { let obj = {}; // 处理叶子节点(纯文本) if (xml.children.length === 0) { return xml.textContent.trim(); } for (let i = 0; i < xml.children.length; i++) { let item = xml.children.item(i); let nodeName = item.nodeName; // 先获取子元素的转换结果 let childObj = xml2js(item); // 给子元素添加属性 if (item.attributes && item.attributes.length > 0) { // 如果子元素是纯文本,转成带文本字段的对象,避免属性覆盖文本 if (typeof childObj !== 'object') { childObj = { _text: childObj }; } for (let attribute of item.attributes) { childObj[attribute.nodeName] = attribute.nodeValue; } } // 处理同节点名的数组场景 if (obj[nodeName]) { if (!Array.isArray(obj[nodeName])) { obj[nodeName] = [obj[nodeName]]; } obj[nodeName].push(childObj); } else { obj[nodeName] = childObj; } } return obj; } catch (e) { console.error(e.message); } }
关键修改说明
- 先调用
xml2js(item)得到子元素的JSON对象,避免属性和子对象脱节 - 针对纯文本子元素,额外用
_text字段存文本内容,确保属性和文本都能保留 - 把属性直接添加到子元素的JSON对象中,再将这个完整的子对象赋值给父对象的对应节点
测试示例
假设输入XML:
<root> <topic id="js-basic">JavaScript入门</topic> <topic id="xml-json">XML转JSON实战</topic> </root>
修复后输出的JSON:
{ "root": { "topic": [ { "id": "js-basic", "_text": "JavaScript入门" }, { "id": "xml-json", "_text": "XML转JSON实战" } ] } }
可以看到id属性已经正确归属到对应的topic对象里。
内容的提问来源于stack exchange,提问作者live627
相关产品推荐
相关产品推荐

