通过XML Groovy迭代ArrayList

时间:2016-08-13 18:01:50

标签: xml groovy

我在xml上迭代一个arraylist并使用arraylist中存在的值列表创建另一个xml。这是使用

的代码
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如何获取arraylist中存在的父节点的所有子节点。例如,如果我的列表和输入具有以下

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的一部分而g不在列表中,因此相应的xml输出应为

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

1 个答案:

答案 0 :(得分: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())}