Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 在NodeJs中使用快速xml解析器将特定标记解析为数组_Node.js_Json_Xml_Parsing - Fatal编程技术网

Node.js 在NodeJs中使用快速xml解析器将特定标记解析为数组

Node.js 在NodeJs中使用快速xml解析器将特定标记解析为数组,node.js,json,xml,parsing,Node.js,Json,Xml,Parsing,我在代码中使用快速xml解析器将xml字符串转换为JSON。问题是在XML中,我有一个包含元素数组的标记,但是当我们在这个标记中只收到一个元素时,这个标记中的值会被解析为JSON对象,而不是JSON数组。然而,当有多个值时,它会被解析为数组 下面是当标签中只有一个元素时我收到的示例和输出 xmlString = `<Items> <Item sn="abcd"/> </Items>`

我在代码中使用快速xml解析器将xml字符串转换为JSON。问题是在XML中,我有一个包含元素数组的标记,但是当我们在这个标记中只收到一个元素时,这个标记中的值会被解析为JSON对象,而不是JSON数组。然而,当有多个值时,它会被解析为数组

下面是当标签中只有一个元素时我收到的示例和输出

xmlString = `<Items>
               <Item sn="abcd"/>
            </Items>`
输出:
{Item:[{attributes:[Object]},{attributes:[Object]}]}

是否有办法修复它,以便每次我以JSON数组而不是JSON对象的形式接收项目时?

根据,有一个非常灵活的选项
arrayMode

false
时,单个出现的标记被解析为对象,但在多个出现的情况下被解析为数组。当
true
时,标记将被解析为始终排除叶节点的数组。当
strict
时,所有标记将仅解析为数组。当引用
RegEx
时,只有标记将被解析为与RegEx匹配的数组。当
函数
将标记名传递给可检查的回调时

在您的情况下,一个简单的正则表达式就可以了。但是,不确定它是否需要
/Items/
/Item/
,但您肯定可以立即测试这一点

应导致
作为数组检索的示例案例:

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

或者,您也可以使用camaro转换输出,使其与您想要的一致

您可以重命名字段,使用基于xpath的模板塑造输出

在下面的示例中,您指定输出的属性
items
是一个数组,那么输出将始终是一个数组

范例

var{transform}=require(“camaro”)
异步函数main(){
var xmlString=`
`
变量模板={
项目:[“项目/项目”{
序号:'@sn'
}]
}
var输出=等待转换(xmlString,模板)
log(JSON.stringify(输出,null,4))
}
main()
输出

{
“项目”:[
{
“序号”:“abcd”
}
]
}

感谢您的回复。我看到arryMode是一个布尔值,当设置为true时,它会将所有复杂的标记转换为一个数组。你可以分享一个例子,说明正则表达式如何在选项中被用来将选择性标记作为数组进行解析吗?我尝试了三种组合,但似乎都不起作用
arrayMode:[/Items/,/Item/]
arrayMode:[/Items/]
arrayMode:[/Item/]
@ShailendraChoudhary我编辑了这篇文章,
arrayMode
本身不应该是一个数组。@stock Overlaugh:谢谢你的解决方案!第一个不适合我,因为在我的XML中有另一个名为“PackedItems”的标记,该标记本应作为对象解析,但由于正则表达式的原因,被解析为数组,而且我有多个这样的标记。我使用了这个
arrayMode:tagName=>['Item','Transaction'].includes(tagName)
,它起了作用。您的预期输出是什么?似乎对于Camaro,我必须提供模板中的所有标记。所以,如果还有1000多个元素(字符串和复杂值的混合),我必须将它们全部包含在模板中。这种理解正确吗?@ShailendraChoudhary是的。这是一种塑造输出对象的方法,因此我们必须在模板中写入所需的所有内容
arrayMode: /Item/
arrayMode: tagName => tagName === 'Item'