使用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">Something Else</string>'/>
</target>
以上是关于使用Ant替换XML文件中的值的主要内容,如果未能解决你的问题,请参考以下文章