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

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);
    }
}

关键修改说明

  1. 先调用xml2js(item)得到子元素的JSON对象,避免属性和子对象脱节
  2. 针对纯文本子元素,额外用_text字段存文本内容,确保属性和文本都能保留
  3. 把属性直接添加到子元素的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 05:10:16