在构建时解析xml文件并修改其值/内容

时间:2018-03-21 07:50:57

标签: groovy xml-parsing android-gradle build.gradle

我想在build.gradle文件的构建期间解析一个xml文件并想要修改xml的某些值,我按照这个SO问题回答Load, modify, and write an XML document in Groovy但是我的修改不能改变xml文件。谁能帮我吗。感谢

build.gradle中的代码:

def overrideLocalyticsValues(String token) {
def xmlFile = "/path_to_file_saved_in_values/file.xml"
def locXml = new XmlParser().parse(xmlFile)

locXml.resources[0].each {
    it.@ll_app_key = "ll_app_key"
    it.value = "123456"
}
XmlNodePrinter nodePrinter = new XmlNodePrinter(new PrintWriter(new FileWriter(xmlFile)))
nodePrinter.preserveWhitespace = true
nodePrinter.print(locXml)
}

xml文件:

<resources>
<string name="ll_app_key" translatable="false">MY_APP_KEY</string>
<string name="ll_gcm_sender_id" translatable="false">MY_GCM_SENDER_ID</string>
</resources>

2 个答案:

答案 0 :(得分:2)

在你的代码中:是不是......?节点名称和属性在哪里..?

locXml.resources[0].each {    // Wrongly entered without node name 
    it.@ll_app_key = "ll_app_key"   // Attribute name @name
    it.value = "123456"           // you can't change or load values here
}

您尝试读取和写入同一文件。尝试使用此代码替换xml文件的确切节点。 XmlSlurper提供此功能。

更新:

import groovy.util.XmlSlurper
import groovy.xml.XmlUtil

def xmlFile = "test.xml"
def locXml = new XmlSlurper().parse(xmlFile)


locXml.'**'.findAll{ if (it.name() == 'string' && it.@name == "ll_app_key") it.replaceBody 12345 }

new File (xmlFile).text = XmlUtil.serialize(locXml)

答案 1 :(得分:0)

Groovy有一个更好的方法,而不是像你一样尝试做的基本替换 - SimpleTemplateEngine

static void main(String[] args) {
    def templateEngine = new SimpleTemplateEngine()
    def template = '<someXml>${someValue}</someXml>'
    def templateArgs = [someValue: "Hello world!"]
    println templateEngine.createTemplate(template).make(templateArgs).toString()
}

输出:

<someXml>Hello world!</someXml>