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

Node.js环境下如何从含嵌套数组的JSON生成指定结构XML

Node.js 从JS对象生成指定结构XML的解决方案

问题背景

你的JS对象结构如下:

const data = {
    "root": {
        "id": 12,
        "title": "root title",
        "people": [
            {"id": 33,"name": "Bill"},
            {"id": 34,"name": "Elon"}
        ],
        "camps":[
            {"id":1,"addr":"in mountain"},
            {"id":2,"addr":"at lake"}
        ]
    }
};

期望生成的XML需要保留层级结构,将数组嵌套在父节点下,同时把对象的键值对作为元素属性:

<?xml version="1.0" encoding="UTF-8"?>
<root id="12" title="root title">
    <people>
        <person id="33" name="Bill" />
        <person id="34" name="Elon" />
    </people>
    <camps>
        <camp id="1" addr="in mountain"/>
        <camp id="2" addr="at lake"/>
    </camps>
</root>

但部分库会将数组拆分为重复的同级节点,还会把属性转为子元素,生成不符合预期的结果:

<?xml version="1.0"?>
<root>
  <id>12</id>
  <title>root title</title>
  <people>
    <id>33</id>
    <name>Bill</name>
  </people>
  <people>
    <id>34</id>
    <name>Elon</name>
  </people>
  <camps>
    <id>1</id>
    <addr>In mountant</addr>
  </camps>
  <camps>
    <id>1</id>
    <addr>At lake</addr>
  </camps>
</root>

解决方法:使用xmlbuilder2库

xmlbuilder2支持手动控制XML节点结构,能精准实现你的需求,步骤如下:

  1. 安装依赖
npm install xmlbuilder2
  1. 编写转换代码
const { create } = require('xmlbuilder2');

const data = {
    "root": {
        "id": 12,
        "title": "root title",
        "people": [
            {"id": 33,"name": "Bill"},
            {"id": 34,"name": "Elon"}
        ],
        "camps":[
            {"id":1,"addr":"in mountain"},
            {"id":2,"addr":"at lake"}
        ]
    }
};

// 初始化XML文档
const doc = create({ version: '1.0', encoding: 'UTF-8' });
// 创建root节点,自动将id、title转为属性
const rootNode = doc.ele(data.root);

// 处理people数组:创建people父节点,遍历添加person子节点
const peopleParent = rootNode.ele('people');
data.root.people.forEach(person => {
  peopleParent.ele('person', person);
});

// 处理camps数组:创建camps父节点,遍历添加camp子节点
const campsParent = rootNode.ele('camps');
data.root.camps.forEach(camp => {
  campsParent.ele('camp', camp);
});

// 生成格式化的XML字符串
const finalXml = doc.end({ prettyPrint: true });
console.log(finalXml);

代码说明

  • 调用ele()方法创建节点时,传入对象会自动将键值对转为节点属性
  • 通过遍历数组,将每个数组元素作为子节点添加到对应的父节点下,保留层级关系
  • prettyPrint: true参数用于生成格式化的XML,方便阅读

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 10:05:22