我很感激以下问题的帮助。 (我是Groovy的新手,我无法找到解决我问题的具体例子。)
使用XmlSlurper
我试图替换具有特定值的子节点的XML节点。例如,我想转换:
<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的资产。
我的失败尝试是:
def assets = new XmlSlurper().parseText(deviceXml)
assets.asset[name.text()=="MyPackageName"].replaceNode{
asset{
name("MyPackageName")
data()
}
}
我为&#34; asset&#34;的遗失属性获得groovy.lang.MissingPropertyException
例外很明显我找到我的节点的语法是错误的。
答案 0 :(得分:2)
以下示例完成了这项工作:
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
} )