gradle - 在gradle中更新具有特定ID的xml元素

标签 gradle groovy

我想在xml文件中进行以下更改

我的test.xml

<root>
    <display-name>Some Name</display-name>
    ....
    <resource-ref id='change'>
        <resource-name>Change this</resource-name>
    </resource-ref>
    <resource-ref id='modify'>
        <resource-name>Change this too</resource-name>
    </resource-ref>
</root>

我想在这个xml文件中进行更改,使其看起来像这样
<root>
    <display-name>Final Name</display-name>
    ....
    <resource-ref id='change'>
        <resource-name>After Change</resource-name>
    </resource-ref>
    <resource-ref id='modify'>
        <resource-name>After Modify</resource-name>
    </resource-ref>
</root>

this问题中的第一个答案几乎可以回答我的问题。但是,您需要对具有特定ID的元素进行特定更改。

这看起来很简单。我尝试寻找答案,但找不到。任何帮助表示赞赏。

而且我的gradle脚本看起来像这样
task ("replace")<<{
def xmlSource = file(path/to/test.xml)
def xmlDest = file(path/to/destination)
def xmlParser = new XmlParser()
xmlParser.setFeature("http://apache.org/xml/features/disallow-doctype-decl", false)
def xmlRoot = xmlParser.parse(xmlSource)

xmlRoot.'display-name'[0].value = 'RTM16'
//Looking for something like this
//xmlRoot.'resource-ref'[@id='change'].'resource-name'[0].value = 'After Change'
//xmlRoot.'resource-ref'[@id='modify'].'resource-name'[0].value = 'After Modify'

def nodePrinter = new XmlNodePrinter(new PrintWriter(new FileWriter(xmlDest)))
nodePrinter.preserveWhitespace = true
nodePrinter.print(xmlRoot)
}

最佳答案

经过Node (Groovy 2.4.6)之后,我想到了这个

task ("replace")<<{
xmlSource = file(path/to/xml source file)
xmlDest = file(path/to/destinationfile)
def parser = new XmlParser()
def xmlRoot = parser.parse(xmlSource)
xmlRoot.each{
    if(it.name().equals("resource-ref")&& it.@id.equals("change")){
        it.'resource-name'[0].value = 'After Change'
    }
    else if(it.name().equals("resource-ref")&& it.@id.equals("modify")){
        it.'resource-name'[0].value = 'After Modify'
    }
}

def b = new XmlNodePrinter(new PrintWriter(new FileWriter(xmlDest)))
b.preserveWhitespace = true
b.print(z)
}

不确定是否是最好的方法。但是有效

关于gradle - 在gradle中更新具有特定ID的xml元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36568442/

相关文章:

android - 如何使用Android 3.3加密build.gradle中的密码?在IDE中获取 “Cannot resolve symbol”

grails - 限制为大写的Groovy字符串

grails - 在这种情况下,findAllBy *如何工作?

gradle - 升级到grails 3,现在无法解析类org.codehaus.groovy.grails.web.servlet.mvc.GrailsParameterMap

node.js - Gradle Moowork Node 插件

java - 从命令行使用 Gradle 构建时出现 "Package R does not exist"错误

java - 更新 gradle 包装文件会产生不同的结果

除非我手动调用 Grape 解析,否则 Groovy 1.8 @Grab 会失败

spring-boot - IntelliJ 无法识别 Kotlin JPA 插件

java - Gradle 和 Bintray 插件 : Cannot cast _Decorated