1

我有一个如下所示的 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 .../>

我想将此文件解析为一个Items 数组,如下所示:

[
  {
    "prop": "foo",
    "list": [
      { "key": "1" },
      { "key": "2" },
      { "key": "3" },
      { "key": "4" },
      { "key": "5" },
      { "key": "6" }
    ]
  },
  { ...item }
  { ...item }
]

即按顺序A处理所有,BC标签并放入同一个数组中。

我正在使用xml2json,它用于node-expat解析文件。这完全有可能使用node-expat或任何现有的npm包吗?我问的原因是因为如果可能的话,我不想用编译语言编写自己的解析器。

谢谢

4

1 回答 1

3

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

如果是这样,您可以尝试如下所示的camaro

编辑: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))

输出

[
  {
    "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"
  }
]
于 2018-04-06T10:45:56.770 回答