JavaScript Elementtree获取特定元素之间的所有元素

时间:2017-06-14 09:05:28

标签: javascript node.js xml elementtree

我有一个以下格式的xml,想要获得start和end之间的所有元素。但是名字没有定义或者可以改变,所以我需要全力以赴。

<startEvent name="Start"/>
.
.

<a name="something"/>
<b name="something"/>
<c name="something"/>
.
.
.
.
<endEvent name="End" />

现在我使用Elementree从String解析xml并找到Elements。但如果有更好的选择,我不必坚持下去。

3 个答案:

答案 0 :(得分:0)

不是你想要的东西,但也许你可以试试这个

const transform = require('camaro')

const xml = `
<startEvent name="Start"/>
    <a name="something"/>
    <b name="something"/>
    <c name="something"/>
    <d name="something"/>
<endEvent name="End" />
`
const result = transform(xml, {
    list: ['//*[@name != "Start" and @name != "End"]', {
        node_name: 'name()',
        value_in_name: '@name'
    }]
})

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

输出

{
  "list": [
    {
      "node_name": "a",
      "value_in_name": "something"
    },
    {
      "node_name": "b",
      "value_in_name": "something"
    },
    {
      "node_name": "c",
      "value_in_name": "something"
    },
    {
      "node_name": "d",
      "value_in_name": "something"
    }
  ]
}

如果有许多名称属性的节点,则无效。除非你想要提取的整个东西都在一个唯一的节点名下。

答案 1 :(得分:0)

我解决了这个问题,而不是超级优雅,但它有效:

started=false
    xmlData.findall('./process')[0]._children.forEach(function(taskEntry){
        if(taskEntry.tag=="startEvent"){
            started=true
        }
        if(taskEntry.tag=="endEvent"){
            started=false
        }
        if(started==true || taskEntry.tag =="endEvent"){
            nodes.push(getElement(taskEntry))
        }

    })

答案 2 :(得分:0)

Xpath可能会为你做!它对于python中的这种东西特别有用,也许有一个JavaScript版本。