You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 23:53:17