2016-08-13 29 views
0

迭代ArrayList的我遍歷XML一個ArrayList和創建與當前數組列表中的值列表另一個XML。這裏是代碼我使用基於XML的Groovy

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 

該代碼可用於不具有子節點如何獲得父母這是目前ArrayList中的所有子節點的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>''' 

由於a和b是存在於列表中和節點e是B A部分和g不存在於列表中,則相應的XML輸出應

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

你想刪除節點'g',對吧? – Rao

回答

0

這裏在這種情況下,轉換後的xml幾乎與輸入相同,只是節點g不存在於輸出中。使用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() 

編輯:

如果XML有namespaces,需要以下變化。

更改從:
def nodes = xml.'**'.findAll{ it.name() == 'g' }

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

enter image description here

UPDATE2:

如果你想要保存節點列表,那麼這裏是需要的簡單更改

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

@GroovyBeginner,你在你的問題中給出了輸入和輸出,上面解決了這個問題。不是嗎?如果是,那麼你可以編輯問題並進行數據輸入/輸出更改以支持您的評論? – Rao

+0

@GroovyBeginner,將不需要的元素放在列表中很簡單,所以只需將'g'放入列表中即可。 – Rao

+0

謝謝。這也以更簡單的方式給出預期的輸出! –