使用ANT替换整个XML标记

时间:2012-04-10 20:55:59

标签: xml ant

PhoneGap Build提供了一个服务(目前在测试版期间免费),他们将获取HTML + JS + CSS源代码,以及用于配置构建选项(config.xml)的XML文件,并执行服务器端构建所有支持的平台(iOS,Android,黑莓,Symbian,WebOS),节省了大量时间,节省了大量的头痛药费。

不幸的是,there is inconsistent behavior with the way links to external websites work

  

目前,为了在外部浏览器中打开链接,需要将不同的代码上传到PhoneGap Build。对于iOS,域名必须列入白名单,而对于Android,域名必须不公开。

     

您可以通过向访问标记添加属性来使其保持一致,例如includeForAndroid =“false”,它不会包含Android上的访问标记内容,因此链接将在外部浏览器中打开,就像在iOS上一样。

Config.xml docs;这是a relevant blog post

虽然员工提出了修改建议,但尚未在产品中制作和发布:

  

我们希望在Cordova开源项目中理顺这一点:与此同时,对于PhoneGap Build,我正在考虑这样的事情:

<access origin="*" onlyInBrowser="true" />
     

这不会包含Android上的标记,但会包含在iOS上。

在产品中进行此更改并且可用之前,解决方法是制作两个我将上传的zip文件:一个用于Android(没有访问标记),另一个用于iOS(带有访问标记)。不理想,但这是一致的应用程序行为必须做的事情。

我已经在使用ANT来自动化这个项目中的许多任务,所以如果ANT也可以为我做config.xml更新,那将是理想的。

作为参考,这是我的ANT代码,它将构建两个拉链:

<target name="BUILD-ZIP" depends="verify-using-minified-js,prepare-for-build">

    <tstamp>
        <format property="build.tstamp" pattern="yyyy-MM-dd__HH-mm-ss" />
    </tstamp>

    <antcall target="zip-ios">
        <param name="tstamp" value="${build.tstamp}" />
    </antcall>

    <!-- build android second so that we can just remove the access tags -->
    <antcall target="zip-android">
        <param name="tstamp" value="${build.tstamp}" />
    </antcall>

</target>

<target name="zip-ios">
    <zip destfile="${dir.pkg.phonegap}${tstamp}-apple.zip">
        <zipfileset dir="${dir.pkg.tmp}">
            <exclude name="build.xml" />
            <exclude name="build.properties" />
            <exclude name="settings.xml" />
            <exclude name=".project" />
            <exclude name="**/*.psd" />
            <exclude name="assets/js/app.js" />
            <exclude name="assets/js/cordova-1.5.0.js" />
        </zipfileset>
    </zip>
</target>

<target name="zip-android">

    <!-- before building android zip, get rid of the <access> tags -->

    <zip destfile="${dir.pkg.phonegap}${tstamp}-android.zip">
        <zipfileset dir="${dir.pkg.tmp}">
            <exclude name="build.xml" />
            <exclude name="build.properties" />
            <exclude name="settings.xml" />
            <exclude name=".project" />
            <exclude name="**/*.psd" />
            <exclude name="assets/js/app.js" />
            <exclude name="assets/js/cordova-1.5.0.js" />
        </zipfileset>
    </zip>
</target>

<target name="prepare-for-build">

    <!-- increment build number -->
    <propertyfile file="build.properties">
        <entry key="version.build.number" type="int" operation="+" default="1"/>
    </propertyfile>
    <property file="build.properties"/>
    <echo message="BUILD NUMBER: ${version.build.number}"/>

    <delete includeemptydirs="true" verbose="false">
        <fileset dir="${dir.pkg.tmp}" includes="**/*"/>
    </delete>
    <filter token="BUILD_NUMBER" value="${version.build.number}" />
    <filter token="VERSION_MAJOR" value="${version.major}" />
    <filter token="VERSION_MINOR" value="${version.minor}" />
    <copy todir="${dir.pkg.tmp}" verbose="true" overwrite="true" filtering="true">
        <fileset dir="${dir.dev}" includes="**/*" />
    </copy>

</target>

zip-android目标中有评论:

<!-- before building android zip, get rid of the <access> tags -->

这是我想要替换的地方。我已尝试使用<filter>任务以及<replace><replaceRegExp>,但我似乎找不到办法,而这一切都归结为这样的事实:我需要替换字符串:<access ... />,并且这些替换方法似乎都不允许在token / match / etc属性中使用<>。我尝试过使用CDATA,但也无法使用CDATA。

我最接近的是,ANT没有抛出任何错误,是这样的:

<replace file="${dir.pkg.tmp}config.xml" failOnNoReplacements="true">
    <replacetoken>
        <![CDATA[<access origin="http://example.com" subdomains="true" />]]>
    </replacetoken>
</replace>

理论上,这会将指定的<access ... />标记替换为空字符串because I've omitted the value attribute

不幸的是,由于failOnNoReplacements属性以及由于某种原因它没有进行任何替换而导致失败。

这可能吗?如果是这样,我做错了什么?!

3 个答案:

答案 0 :(得分:3)

如果您在令牌和值中对XML字符串的元素进行编码,则Ant替换任务将起作用...例如:

在config.xml中

    <option name="some.unwanted.configuration" />

在build.xml中

    <replace file="${build.dir}/config.xml"
        token="&lt;option name=&quot;some.unwanted.configuration&quot; /&gt;" 
        value="&lt;!-- unwanted configuration removed --&gt;"
    />

结果

    <!-- unwanted configuration removed -->

答案 1 :(得分:1)

哈,我设法制定了解决方法来阻止尖括号。

在config.xml中:

<!--access_tag1_here-->

在build.xml中:

<replace 
    file="${dir.pkg.tmp}config.xml" 
    failOnNoReplacements="true"
    token="!--access_tag1_here--" 
    value="access origin='http://example.com' subdomains='true' /"
    />

这会将评论转换为必要的访问标记。

我切换了我的拉链顺序,以便Android现在首先显示注释仍为注释,然后iOS zip进程插入访问标记。

答案 2 :(得分:0)

在处理xml时,我建议使用xmltask
根据您的要求,请参阅:xml task manual replace
一点点的Xpath知识就派上用场了,见:
http://zvon.org/xxl/XPathTutorial/
http://www.w3schools.com/xpath/