我在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>'''
答案 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' }
<强> UPDATE2:强>
如果您想要保留节点列表,那么这里只需要进行简单的更改
def elementsToKeep = ["a","b","c","d"]
def nodes = xml.'**'.findAll{ !elementsToKeep.contains(it.name())}