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节点结构,能精准实现你的需求,步骤如下:
- 安装依赖
npm install xmlbuilder2
- 编写转换代码
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
相关产品推荐
相关产品推荐

