Node.js中JS对象转XML时数组解析不符合预期的解决办法
解决数组转XML时生成重复节点的问题
推荐使用xmlbuilder2库
这个库对XML结构的控制灵活性很高,完全能满足你生成多个<foo>节点的需求。
首先安装依赖:
npm install xmlbuilder2
然后用以下代码实现转换:
const { create } = require('xmlbuilder2'); const jsonObject = { root: { foo: [ { bar: 'a' }, { bar: 'b' } ] } }; // 构建XML const xml = create({ version: '1.0' }) .ele('root') .ele(jsonObject.root.foo.map(item => ({ foo: item }))) // 为数组每个元素生成独立的foo节点 .end({ prettyPrint: true }); console.log(xml);
执行后会输出你预期的XML:
<root> <foo> <bar>a</bar> </foo> <foo> <bar>b</bar> </foo> </root>
手动实现简易转换器的思路(如需自定义)
如果还是想自己写,可以基于递归遍历对象的逻辑:
- 遍历对象的键值对,遇到值为数组时,循环数组中的每个元素,为每个元素生成对应名称的节点
- 非数组值则直接生成子节点
- 处理嵌套结构时递归调用转换逻辑
示例核心逻辑片段:
function jsonToXml(obj, parentNode) { for (const [key, value] of Object.entries(obj)) { if (Array.isArray(value)) { // 数组元素逐个生成同名节点 value.forEach(item => { const childNode = parentNode.ele(key); jsonToXml(item, childNode); }); } else if (typeof value === 'object' && value !== null) { const childNode = parentNode.ele(key); jsonToXml(value, childNode); } else { parentNode.ele(key).txt(value); } } }
可以基于这个逻辑结合xmlbuilder2或原生字符串拼接来完成完整转换器。
内容的提问来源于stack exchange,提问作者Jakub Vala
相关产品推荐
相关产品推荐

