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

问题描述:

我有以下格式的xml,并且想要获取开始和结束之间的所有元素。但名称没有定义或可以更改,所以我需要全部介入。JavaScript Elementtree获取特定元素之间的所有元素

<startEvent name="Start"/> 
. 
. 

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

现在我使用Elementree来解析字符串中的xml并找到元素。但是,如果有更好的选择,我不必拘泥于此。

+0

这些节点不在'startEvent'节点中,而是在'startEvent'和'endEvent'之间? –

你想,但不太可能的东西你可以试试这个

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版本。