Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.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
Arrays 按顺序将XML解析为数组_Arrays_Node.js_Xml_Xml Parsing_Node Expat - Fatal编程技术网

Arrays 按顺序将XML解析为数组

Arrays 按顺序将XML解析为数组,arrays,node.js,xml,xml-parsing,node-expat,Arrays,Node.js,Xml,Xml Parsing,Node Expat,我有一个XML文件,如下所示: <Item prop="foo"> <A key="1"> <B key="2"> <A key="3"> <C key="4"> <A key="5"> <A key="6"> </Item> <Item .../> <Item .../> 即,按顺序将所有A、B和C标记处理到同一数组中 我正在使用xml2json,它

我有一个XML文件,如下所示:

<Item prop="foo">
  <A key="1">
  <B key="2">
  <A key="3">
  <C key="4">
  <A key="5">
  <A key="6">
</Item>
<Item .../>
<Item .../>
即,按顺序将所有
A
B
C
标记处理到同一数组中

我正在使用
xml2json
,它使用
node expat
解析文件。使用
node expat
或任何现有的
npm
软件包是否可以实现这一点?我问这个问题的原因是,如果可能的话,我不想用编译语言编写自己的解析器


谢谢

节点
A
B
C
的数量是否小且已知

如果是这样的话,你可以试试下面的方法

编辑:xml必须有效,在上面的示例中,它没有正确关闭

const transform = require('camaro')
const xml = `
<Item prop="foo">
  <A key="1"/>
  <B key="2"/>
  <A key="3"/>
  <C key="4"/>
  <A key="5"/>
  <A key="6"/>
</Item>
`

const { output } = transform(xml, {
    output: [
        '//Item',
        {
            prop: '@prop',
            list: ['A|B|C', { key: '@key' , tag: 'name()'}]
        }
    ]
})

console.log(JSON.stringify(output, null, 2))

这看起来很好,但我得到了以下警告:
(节点:3186)警告:N-API是一个实验性功能,可能随时更改。
。这个产品准备好了吗?另一个问题:是否可以添加由
a | B | C
匹配的标记作为对象的属性?也就是说,每个项目都有类似
{“key”:“4”,“tag”:“C”}
。@felamaslen请使用2.x.x版。版本3正在使用最新的N-API,这仍然是实验特性。我误解了你的问题。它应该更新为如下
列表:['A | B | C',{key:'@key',tag:'name()}]
const transform = require('camaro')
const xml = `
<Item prop="foo">
  <A key="1"/>
  <B key="2"/>
  <A key="3"/>
  <C key="4"/>
  <A key="5"/>
  <A key="6"/>
</Item>
`

const { output } = transform(xml, {
    output: [
        '//Item',
        {
            prop: '@prop',
            list: ['A|B|C', { key: '@key' , tag: 'name()'}]
        }
    ]
})

console.log(JSON.stringify(output, null, 2))
[
  {
    "list": [
      {
        "key": "1",
        "tag": "A"
      },
      {
        "key": "2",
        "tag": "B"
      },
      {
        "key": "3",
        "tag": "A"
      },
      {
        "key": "4",
        "tag": "C"
      },
      {
        "key": "5",
        "tag": "A"
      },
      {
        "key": "6",
        "tag": "A"
      }
    ],
    "prop": "foo"
  }
]