2016-08-13 5 views
0

私はarmlistをxmlで繰り返し、arraylistに存在する値のリストを持つ別のxmlを作成しています。ここでコードがXML GroovyでArrayListを繰り返し処理する

import groovy.xml.MarkupBuilder 
def books=''' 
    <response version-api="2.0"> 
     <value> 
      <a>2</a> 
      <b>3</b> 
      <e>4</e> 
     </value> 
    </response>''' 
def lst=["a","b","c","d"] 

def sw = new StringWriter() 
def xml = new groovy.xml.MarkupBuilder(sw) 
xml.langs { 
    for(String str: lst) { 
     def response = new XmlSlurper().parseText(books) 

     response.value.'*'.find{ node->   
      if(node.name() == str) { 
       "${str}"(node) 
      }  
     } 
    } 
} 
println sw 

このコードを使用していていることはどのように配列リスト中に存在している親のすべての子ノードを取得する子ノードを持たないXMLのため正常に動作しています。例えば、私のリストと入力aおよびbがリストに存在し、ノードEはBの一部であり、Gがリストに存在しないので、対応するXML出力

であるべき次

lst=["a","b","c","d"] 

def books=''' 
    <response version-api="2.0"> 
     <value> 
      <a>2</a> 
      <b> 
       <e>4</e> 
      </b> 
      <g>123</g> 
     </value> 
    </response>''' 

を有する場合

<response version-api="2.0"> 
    <value> 
     <a>2</a> 
     <b> 
      <e>4</e> 
     </b> 
    </value> 
</response>''' 
+0

ノード 'g'を削除しますか? – Rao

答えて

0

ここでは、ノードgが出力に存在しないことを除いて、変換されたxmlは入力とほぼ同じです。 XmlParserを使用して変換します。

ここには、特定のノード(すべての外観)を削除するスクリプトがあります。

のGroovyスクリプト

import groovy.xml.* 
def books=''' 
    <response version-api="2.0"> 
     <value> 
      <a>2</a> 
      <b> 
       <e>4</e> 
      </b> 
      <g>123</g> 
     </value> 
    </response>''' 
def elementsToBeRemoved = ['g'] 
def xml=new XmlParser().parseText(books) 
//Get all the nodes to be removed 
def nodes = xml.'**'.findAll{ elementsToBeRemoved.contains(it.name())} 
//Remove all the nodes 
nodes.each{it.parent().remove(it)} 
//Serialize to string 
XmlUtil.serialize(xml).toString() 

EDIT:

XMLはnamespacesを持っている場合は、以下の変更が必要とされます。

変更から:
def nodes = xml.'**'.findAll{ it.name() == 'g' }

へ:
def nodes = xml.'**'.findAll{ it.name().localPart == 'g' }

enter image description here

アップデート2:

ノードのリストを保持したい場合は、ここで簡単な変更が必要です

def elementsToKeep = ["a","b","c","d"] 
def nodes = xml.'**'.findAll{ !elementsToKeep.contains(it.name())} 
+0

@ GroovyBeginner、あなたはあなたの質問に入力と出力を与えました。上で問題を解決しています。それじゃない?はいの場合は、質問を編集して、データ入力/出力変更をコメントをサポートするように変更できますか? – Rao

+0

@ GroovyBeginnerでは、不要な要素をリストに入れるのは簡単なので、リストに 'g'を入れてください。 – Rao

+0

ありがとうございます。これにより、より簡単に期待される出力が得られます! –

関連する問題