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

含统一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;
}

关键优化点说明

  1. 优先提取value属性:函数会先检查当前节点是否存在value属性,并且没有子节点,此时直接返回该属性的值,避免生成嵌套的@attributes结构。
  2. 兼容字符串XML输入:新增了字符串转DOM对象的逻辑,不用依赖特定环境的XML语法(比如原代码里的xml.*)。
  3. 支持重复标签:如果XML里有多个同名标签(比如多个<item>),会自动转为数组,防止数据被覆盖。
  4. 保留忽略属性的功能:原函数的ignored参数依然生效,会跳过你指定的属性。

额外调整建议

如果你的XML中存在既有value属性又有子节点的情况,当前逻辑会保留@attributes和子节点。如果你希望优先value属性忽略子节点,可以把if (valueAttr && length === 0)改为if (valueAttr)即可。

内容的提问来源于stack exchange,提问作者nkn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:25:17