【问题标题】:Parsing xml file at build time and modify its values/content在构建时解析 xml 文件并修改其值/内容
【发布时间】:2018-03-21 07:50:57
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    在您的代码中:对吗...?节点名称和属性在哪里..?

    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)
    

    【讨论】:

    • 收到有关 XmlUtil 的此错误:错误:groovy.lang.MissingPropertyException:在项目 ':app' 上找不到属性 'XmlUtil'。
    • @KapilRajput 你不需要 XmlUtil 你可以删除它。检查我更新的答案。
    • 感谢我可以在 gradle 控制台中看到更改,但请您建议我如何覆盖保存在 values 文件夹中的实际文件中的这些更改
    • @KapilRajput 你能import groovy.xml.StreamingMarkupBuilder ..吗?如果不能,你需要有grooovy-xml jar。
    • def writer = new FileWriter(xmlFile) XmlUtil.serialize(locXml,writer) 有效,请编辑您的答案可能对某人也有帮助
    【解决方案2】:

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

    输出:

    &lt;someXml&gt;Hello world!&lt;/someXml&gt;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-04
      • 2018-05-14
      • 1970-01-01
      • 1970-01-01
      • 2020-12-20
      • 1970-01-01
      • 2016-01-05
      相关资源
      最近更新 更多