Groovy XmlSlurper用给定的子节点值替换节点 [英] Groovy XmlSlurper replace node with given child node value

查看:279
本文介绍了Groovy XmlSlurper用给定的子节点值替换节点的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

对于以下问题,我将不胜感激. (我是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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆