使用Ant替换XML文件中的值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Ant替换XML文件中的值相关的知识,希望对你有一定的参考价值。

我正在尝试自动化我的android构建过程。为此,我想在XML文件中更改应用程序名称。代码是这样的

<resources>
   <string name="app_name">Realta Connections</string>
</resources>

现在我想在构建时用其他东西替换名称'Realta Connections',这是我在构建时给出的名称。名称可以是“Realta Connections”或其他任何内容,因此我需要检测name =“app_name”并替换其中的内容。我试着寻找怎么做但却找不到精确的方法。我怎样才能做到这一点?请帮忙。

答案

最简单的是有一个固定值,它将被替换。这将允许使用替换任务:由于xml字符,您需要replacetoken / replacevalue![CDATA[]]中的字符串。

  <replace casesensitive="false" 
    file="../KS.build/ivy.properties">
    <replacetoken><![CDATA[<string name="app_name">Realta Connections</string>]]></replacetoken>  
    <replacevalue><![CDATA[<string name="app_name">Something else</string>]]></replacevalue>  
  </replace>

否则没有正常的蚂蚁解决方案(repleaceregex不允许嵌套的CDATA替换)。

链接:

另一答案

我知道这个问题已经很老了,但这是一个想法。这似乎不是一个纯粹的蚂蚁解决方案,但你可以使用<scriptdef>标签在ant中嵌入一个脚本。

这是一个可用于在XML文件中搜索内容并将结果存储在属性中的函数:

<scriptdef name="xpath-query" language="javascript">
        <attribute name="query"/>
    <attribute name="xmlfile"/>
    <attribute name="property"/>
     <![CDATA[
        importClass(java.io.FileInputStream);
        importClass(javax.xml.xpath.XPath);
        importClass(javax.xml.xpath.XPathConstants);
        importClass(javax.xml.xpath.XPathFactory);
        importClass(org.xml.sax.InputSource);
        importClass(java.lang.System);


        var exp = attributes.get("query");          
        var filename = attributes.get("xmlfile");
        var xpath = XPathFactory.newInstance().newXPath();          
        var input = new InputSource(new FileInputStream(filename));
        var value = xpath.evaluate(exp, input, XPathConstants.STRING);          
        self.project.setProperty( attributes.get("property"), value );          
        System.out.println("Copied this value:" + value + " to this property:" + attributes.get("property"));

    ]]>
</scriptdef>

然后,您可以使用刚刚定义的xpath-query任务获取应用程序的当前名称:

<xpath-query query='pathToResources
esourcesstring[@name="app_name"]' xmlFile="app.xml" property="appName" />

然后,应用程序名称将存储在属性appName中。

从那里你可以使用应用程序名称在xml文件上进行正则表达式替换。

<replaceregexp file="app.xml" match="${appName}" replace="${newAppName}" />

这种特殊方法的潜在缺点是,如果您在XML文件中的其他位置具有相同的应用程序名称字符串,则正则表达式替换可能会替换您不想要的内容。

您可以定义<scriptdef>来进行替换,而不是仅仅存储在属性中找到的内容,但是我已经将这部分代码用得很方便了。

另一答案

在ANT中处理XML时,我总是推荐xmltask。根据您的要求,请参阅xml task manual replace

一点点Xpath知识不会受到伤害,请参阅:

http://zvon.org/xxl/XPathTutorial/

http://www.w3schools.com/xpath/

另一答案

尝试这个代码,它适合我

<target name="change-app-name">
    <replaceregexp file="res/values/strings.xml" match='name="app_name"(.*)'
        replace='name="app_name"&gt;Something Else&lt;/string&gt;'/>
</target>

以上是关于使用Ant替换XML文件中的值的主要内容,如果未能解决你的问题,请参考以下文章

使用 Ant 构建在 xml 中替换值/版本/日期的占位符

Android中用ANT打包如何将内容复制到AndroidManifest文件中

Ant读取XML文件的值

VB.NET修改替换xml文件中的值

替换VB6中的XML节点中的值

将 .properties 文件中的值设置为 web.xml