我想在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>
答案 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>