如何将XML文件转换为NodeJS数组并保留原文件的顺序?
保留XML节点顺序转换为Node.js数组对象的方法
方法一:调整xml2js库的解析配置
xml2js本身支持保留子节点顺序,通过配置preserveChildrenOrder: true可让解析结果包含按顺序排列的子节点数组(存放在$$属性中),再通过自定义转换函数得到目标格式:
- 安装依赖:
npm install xml2js
- 示例代码:
const xml2js = require('xml2js'); // 待解析的XML内容 const xmlContent = ` <xml> <a>content1</a> <b>content2</b> <a>content3</a> <c>content4</c> </xml> `; // 初始化解析器,配置保留节点顺序 const parser = new xml2js.Parser({ preserveChildrenOrder: true, // 开启子节点顺序保留 explicitArray: false, // 非数组节点不强制转为数组 ignoreAttrs: true // 忽略XML属性,需要保留可删除此配置 }); parser.parseString(xmlContent, (err, parsedResult) => { if (err) throw err; // 将$$数组转换为目标格式 const orderedResult = parsedResult.xml.$$.map(childNode => { const tagName = childNode['#name']; // 处理节点内容:文本节点取_属性,嵌套节点直接取节点对象 const nodeContent = childNode._ || childNode; return { [tagName]: nodeContent }; }); console.log(JSON.stringify(orderedResult, null, 2)); });
执行后输出:
[ { "a": "content1" }, { "b": "content2" }, { "a": "content3" }, { "c": "content4" } ]
方法二:使用fast-xml-parser库
fast-xml-parser支持直接以数组形式保留节点顺序,配置更简洁:
- 安装依赖:
npm install fast-xml-parser
- 示例代码:
const { XMLParser } = require('fast-xml-parser'); const xmlContent = ` <xml> <a>content1</a> <b>content2</b> <a>content3</a> <c>content4</c> </xml> `; // 初始化解析器,开启顺序保留 const parser = new XMLParser({ ignoreAttributes: true, preserveOrder: true // 核心配置,保留节点顺序 }); const parsedResult = parser.parse(xmlContent); // 提取根节点下的有序子节点并转换格式 const orderedResult = parsedResult[0].xml.map(item => { const [tagName, content] = Object.entries(item)[0]; return { [tagName]: content }; }); console.log(JSON.stringify(orderedResult, null, 2));
执行后同样会输出符合需求的有序数组结构。
嵌套节点处理说明
如果XML包含嵌套节点(如<a><d>text</d></a>),需要对转换函数进行递归处理,确保嵌套节点的顺序也能保留。比如在xml2js的转换函数中,若发现节点存在$$属性,就递归调用转换逻辑。
内容的提问来源于stack exchange,提问作者Nelibo
相关产品推荐
相关产品推荐

