JavaScript Elementtree获取特定元素之间的所有元素
问题描述:
我有以下格式的xml,并且想要获取开始和结束之间的所有元素。但名称没有定义或可以更改,所以我需要全部介入。JavaScript Elementtree获取特定元素之间的所有元素
<startEvent name="Start"/>
.
.
<a name="something"/>
<b name="something"/>
<c name="something"/>
.
.
.
.
<endEvent name="End" />
现在我使用Elementree来解析字符串中的xml并找到元素。但是,如果有更好的选择,我不必拘泥于此。
答
你想,但不太可能的东西你可以试试这个
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"
}
]
}
这是否有与name属性许多节点将无法工作。除非你想提取的整个东西都在一个唯一的节点名下。
答
我解决了它这样的,不是超级优雅,但它的工作原理:
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))
}
})
答
的XPath可能为雅做到这一点!这对python中的这些有用的东西特别有用,也许有一个JavaScript版本。
这些节点不在'startEvent'节点中,而是在'startEvent'和'endEvent'之间? –