如何使用fast-xml-parser的arrayMode将单个元素解析为JSON数组
XML解析时单个子元素无法转为数组的解决方法
问题场景
我尝试了如下XML代码片段:
<keyboard group="126" id="-11687" name="Untitled" maxout="3"> <layouts> <layout first="0" last="17" mapSet="ANSI" modifiers="Modifiers"/> <layout first="10" last="17" mapSet="ANSI" modifiers="Modifiers"/> </layouts> <layoutsX> <layoutX first="10" last="17" mapSet="ANSI" modifiers="Modifiers"/> </layoutsX> </keyboard>
遇到的问题:当子元素只有一个条目(如layoutsX下的layoutX)时,会被解析为JSON对象;但多个条目时(如layouts下的layout)会被解析为数组。
我尝试用arrayMode选项配置,但未解决问题,代码如下:
const options = { ignoreAttributes: false, attributeNamePrefix: '@_', // to access the attribute arrayMode: true }; const xmlFile = readFileSync(filename, 'utf8'); const parser = new XMLParser(options); const jsonObj = parser.parse(xmlFile); // get plain Object const oneEle:any[] = jsonObj.keyboard.layoutsX const twoEle:any[] = jsonObj.keyboard.layouts console.log("oneEle",typeof(oneEle),oneEle, oneEle[0],oneEle.length) console.log("twoEle",typeof(twoEle),twoEle,twoEle[0], twoEle.length)
如何让单个或多个元素都被解析为JSON对象数组?
解决方法
要解决这个问题,你需要精准指定哪些标签必须强制转为数组,而不是仅设置arrayMode: true(部分版本的fast-xml-parser中全局模式不会递归处理嵌套的子元素)。
方案一:指定需要转数组的标签列表
修改配置选项,把arrayMode设置为需要强制转数组的标签名数组:
const options = { ignoreAttributes: false, attributeNamePrefix: '@_', // 明确指定layout和layoutX标签无论数量多少都转为数组 arrayMode: ['layout', 'layoutX'] };
方案二:使用判断函数灵活控制
如果需要更灵活的规则,可通过函数判断标签名:
const options = { ignoreAttributes: false, attributeNamePrefix: '@_', arrayMode: (tagName) => tagName === 'layout' || tagName === 'layoutX' };
配置后的访问方式
配置完成后,解析结果中嵌套的子元素会始终以数组形式存在,你需要调整访问路径:
// 现在layoutsX下的layoutX是数组 const oneEle: any[] = jsonObj.keyboard.layoutsX.layoutX; // layouts下的layout也始终是数组 const twoEle: any[] = jsonObj.keyboard.layouts.layout;
内容的提问来源于stack exchange,提问作者user3443063
相关产品推荐
相关产品推荐

