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
} )