Groovy XmlSlurper 用给定的子节点值替换节点
Groovy XmlSlurper replace node with given child node value
如果您能帮助解决以下问题,我将不胜感激。 (我是 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()
}
}
我得到一个 groovy.lang.MissingPropertyException
异常,因为 "asset" 缺少 属性,很明显我查找节点的语法是错误的。
以下示例可以完成工作:
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
我正在尝试替换一个 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()
}
}
我得到一个 groovy.lang.MissingPropertyException
异常,因为 "asset" 缺少 属性,很明显我查找节点的语法是错误的。
以下示例可以完成工作:
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
} )