如何用xml2js转换XML为指定JSON格式,去除多余数组嵌套?
使用xml2js调整XML转JSON的结构方案
要解决xml2js转换后字段被数组包裹、结构不符合预期的问题,无需复杂字符串替换,只需结合解析选项配置和对象结构重组两步就能实现目标格式:
1. 配置xml2js解析器选项
xml2js默认会把所有XML元素包装成数组,通过设置explicitArray: false可以让单个元素直接转为对象,仅当同一层级存在多个同名元素时才保留数组,从根源减少不必要的数组嵌套。可选搭配trim: true自动清理文本空格,mergeAttrs: true合并XML元素属性到对象中。
2. 重组解析后的JSON结构
解析完成后,遍历得到的图书条目数组,将每个条目重组为包含book和stock子对象的格式。
完整代码示例
const xml2js = require('xml2js'); // 示例XML(可根据你的实际结构调整) const xmlStr = ` <library> <bookEntry> <bookInfo> <title>JavaScript高级程序设计</title> <author>尼古拉斯·泽卡斯</author> <isbn>9787115363392</isbn> </bookInfo> <stockCount>20</stockCount> </bookEntry> <bookEntry> <bookInfo> <title>深入理解ES6</title> <author>尼古拉斯·泽卡斯</author> <isbn>9787115431165</isbn> </bookInfo> <stockCount>15</stockCount> </bookEntry> </library> `; // 初始化解析器并配置核心选项 const parser = new xml2js.Parser({ explicitArray: false, trim: true, mergeAttrs: true }); // 解析XML并调整为目标结构 parser.parseString(xmlStr, (err, parsedResult) => { if (err) { console.error('XML解析失败:', err); return; } // 重组数据:每个条目包含book和stock子对象 const targetFormat = parsedResult.library.bookEntry.map(entry => ({ book: entry.bookInfo, stock: { count: parseInt(entry.stockCount, 10) // 可选:将库存转为数字类型 } })); console.log(JSON.stringify(targetFormat, null, 2)); });
关键说明
- 如果你的XML结构不同(比如
book和stock直接在根条目下),只需修改map函数内的属性映射即可,例如:entry => ({ book: { title: entry.title, author: entry.author }, stock: entry.stock })。 - 若遇到多值字段(比如多作者),
explicitArray会自动保留数组,可根据需求选择保留数组或提取单个元素。
内容的提问来源于stack exchange,提问作者hulike2286
相关产品推荐
相关产品推荐

