Groovy XmlSlurper用给定的子节点值替换节点 [英] Groovy XmlSlurper replace node with given child node value
问题描述
对于以下问题,我将不胜感激. (我是Groovy的新手,我找不到解决我问题的任何具体示例.)
I'd be grateful for help with the following problem. (I am new to Groovy, and I can't find any specific examples addressing my issue).
使用XmlSlurper
我正在尝试替换具有特定值的子级的XML节点.例如,我要转换:
Using XmlSlurper
I am trying to replace an XML node which has a child with a certain value. For example, I want to transform:
<assets>
<!--zero to many asset nodes beforehand-->
<asset>
<name>MyPackageName</name>
<data>
<stringValue>my string value</stringValue>
</data>
</asset>
<!--zero to many asset nodes afterwards-->
</assets>
进入:
<assets>
<!--zero to many asset nodes beforehand-->
<asset>
<name>MyPackageName</name>
<data/>
</asset>
<!--zero to many asset nodes afterwards-->
</assets>
我找不到任何可以找到名称为MyPackageName的资产的代码示例.
I can't find any examples of code which navigate to find my asset with the name MyPackageName.
我失败的尝试是:
def assets = new XmlSlurper().parseText(deviceXml)
assets.asset[name.text()=="MyPackageName"].replaceNode{
asset{
name("MyPackageName")
data()
}
}
对于缺少资产"的属性,我得到一个groovy.lang.MissingPropertyException
异常,因此很明显我查找节点的语法是错误的.
I get a groovy.lang.MissingPropertyException
exception for a missing property for "asset" so clearly my syntax to find my node is wrong.
推荐答案
以下示例完成了该工作:
The following example does the job:
import groovy.xml.XmlUtil
import groovy.xml.StreamingMarkupBuilder
def input = '''<assets>
<!--zero to many asset nodes beforehand-->
<asset>
<name>MyPackageName</name>
<data>
<stringValue>my string value</stringValue>
</data>
</asset>
<!--zero to many asset nodes afterwards-->
</assets>'''
def xml = new XmlSlurper().parseText(input)
xml.asset.data.replaceNode {}
println XmlUtil.serialize(new StreamingMarkupBuilder().bind {
mkp.yield xml
} )
第二种更新方式:
import groovy.xml.XmlUtil
import groovy.xml.StreamingMarkupBuilder
def input = '''<assets>
<!--zero to many asset nodes beforehand-->
<asset>
<name>MyPackageName</name>
<data>
<stringValue>my string value</stringValue>
</data>
</asset>
<!--zero to many asset nodes afterwards-->
</assets>'''
def assets = new XmlSlurper().parseText(input)
assets.asset.replaceNode {
asset {
name("MyPackageName")
data()
}
}
println XmlUtil.serialize(new StreamingMarkupBuilder().bind {
mkp.yield assets
} )
在寻找特定节点时:
import groovy.xml.XmlUtil
import groovy.xml.StreamingMarkupBuilder
def input = '''<assets>
<!--zero to many asset nodes beforehand-->
<asset>
<name>MyPackageName</name>
<data>
<stringValue>my string value</stringValue>
</data>
</asset>
<!--zero to many asset nodes afterwards-->
</assets>'''
def assets = new XmlSlurper().parseText(input)
assets.asset.find {it.name.text() == 'MyPackageName' }. replaceNode {
asset {
name("MyPackageName")
data()
}
}
println XmlUtil.serialize(new StreamingMarkupBuilder().bind {
mkp.yield assets
} )
这篇关于Groovy XmlSlurper用给定的子节点值替换节点的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!