2016-08-13 48 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

谢谢。这也以更简单的方式给出预期的输出! –