我有一个以下格式的xml,想要获得start和end之间的所有元素。但是名字没有定义或者可以改变,所以我需要全力以赴。
<startEvent name="Start"/>
.
.
<a name="something"/>
<b name="something"/>
<c name="something"/>
.
.
.
.
<endEvent name="End" />
现在我使用Elementree从String解析xml并找到Elements。但如果有更好的选择,我不必坚持下去。
答案 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版本。