2017-06-14 19 views
0

次の形式のxmlがあり、開始から終了までのすべての要素を取得する必要があります。名前は定義されていないか、または変更される可能性があるので、私はすべてを理解する必要があります。JavaScript Elementtree特定の要素間のすべての要素を取得

<startEvent name="Start"/> 
. 
. 

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

今、Elementreeを使用してStringからXMLを解析し、Elementsを見つけます。しかし、もっと良い選択肢があれば、それに固執する必要はありません。

+0

これらのノードは 'startEvent'ノードにはなく' startEvent'と 'endEvent'権利の間にありますか? –

答えて

0

ない非常にあなたがしたいが、多分あなたはnameプロパティを持つ多くのノードが存在する場合、この

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" 
    } 
    ] 
} 

これは動作しません試みることができるもの。抽出したいものすべてが固有のノード名の下にある場合を除きます。

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)) 
     } 

    }) 
0

XPathはyaのためにそれを行う可能性があります!これは、Pythonのこのようなものには特に便利です。おそらくJavaScriptバージョンがあります。

関連する問題