json 在NodeJs中使用fast-xml-parser将特定标记解析为数组

46scxncf  于 2023-03-24  发布在  其他
关注(0)|答案(3)|浏览(417)

我使用fast-xml-parser在我的代码中将xml字符串转换为JSON。问题是在XML中我有一个包含元素数组的标记,但是当我们在这个标记中只接收一个元素时,这个标记中的值被解析为JSON对象而不是JSON数组,但是当有多个值时,它被解析为数组。
下面是当tag中只有一个元素时我收到的示例和输出

xmlString = `<Items>
               <Item sn="abcd"/>
            </Items>`

输出:{ Items: { Item: { attributes: [Object] } } }
下面是包含多个元素时的示例和输出

xmlString = `<Items>
               <Item sn="abcd"/>
               <Item sn="efgh"/>
             </Items>`

输出:{ Item: [ { attributes: [Object] }, { attributes: [Object] } ] }
有没有一种方法可以修复它,以便每次我接收到的项目作为JSON数组,而不是JSON对象?

2sbarzqh

2sbarzqh1#

或者,您也可以使用camaro转换输出,这将使其与您想要的一致
你可以重命名字段,用基于xpath的模板来塑造输出。
在下面的示例中,您指定输出的属性items为数组,则输出将始终为数组
范例

var { transform } = require("camaro")

async function main() {
  var xmlString = `<Items>
               <Item sn="abcd"/>
            </Items>`
  var template = {
    items: ['Items/Item', {
        sn: '@sn'
    }]
  }
  var output = await transform(xmlString, template)
  console.log(JSON.stringify(output, null, 4))
}

main()

输出

{
    "items": [
        {
            "sn": "abcd"
        }
    ]
}
0x6upsns

0x6upsns2#

根据文档,有一个非常灵活的选项arrayMode
false时,出现一次的标签被解析为对象,但在多次出现的情况下被解析为数组。当true时,标签将被解析为始终不包括叶子节点的数组。当strict时,所有标签将被解析为数组。当RegEx的示例时,只有标签将被解析为匹配正则表达式的数组。当function时,标签名称被传递给可以检查的回调。
在你的例子中,一个简单的正则表达式就可以了。虽然不确定它是否期望/Items//Item/-但你肯定可以立即测试它。
应导致Item作为数组检索的示例情况:

arrayMode: /Item/
arrayMode: tagName => tagName === 'Item'
exdqitrt

exdqitrt3#

我一直在使用NodeJs中的fast-xml-parse,在新版本的lib中,我需要为此提供一个简单的解决方案。这是一个简单的示例,可以应用到您的代码中。

const xmlDataStr = `
    <S:Envelope>
        <S:Body>
        <w:body2>
        wow phir se
        </w:body2>
        <S:Body>
    </S:Envelope>`;

const stringOptions = [
  'S:Envelope', 'S:Body', 'w:body2'
]
const options = {
  ignoreAttributes: false,
  isArray: (tagName) => {
    if (stringOptions.includes(tagName)) return true;
  }
};
const parser = new XMLParser(options);
const output = parser.parse(data);

output = {"S:Envelope":[{"S:Body":[{"w:body2":"wow phir se","S:Body":[""]}]}]}

相关问题