簡體   English   中英

使用 ANT 替換整個 XML 標簽

[英]Replacing an entire XML tag using ANT

PhoneGap Build提供一項服務(目前在測試期間免費),他們使用您的 HTML+JS+CSS 源代碼以及 XML 文件來配置構建選項 (config.xml),並為所有支持的平台(iOS、 Android、Blackberry、Symbian、WebOS),這可以節省大量時間並為我節省大量頭痛葯費用。

不幸的是, 與外部網站鏈接的工作方式存在不一致的行為

目前,為了在外部瀏覽器中打開鏈接,需要將不同的代碼上傳到 PhoneGap Build。 對於 iOS,域必須列入白名單,對於 Android,域必須不在列表中。

您可以通過向訪問標記添加一個屬性使其保持一致,例如 includeForAndroid="false",它不會包含 Android 上的訪問標記內容,這樣鏈接將在外部瀏覽器中打開,就像在 iOS 上一樣。

配置.xml 文檔 這是一篇相關的博客文章

雖然員工提出了修復建議,但尚未在產品中制作和發布:

我們希望在 Cordova 開源項目中解決這個問題:與此同時,對於 PhoneGap Build,我在想這樣的事情:

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

這將不包括 Android 上的標簽,但將包括 iOS 上的標簽。

在做出此更改並在產品中可用之前,解決方法是制作兩個我將上傳的 zip 文件:一個用於 Android(沒有訪問標簽),另一個用於 iOS(有訪問標簽)。 不理想,但這是保持應用程序行為一致所必須做的。

我已經在使用 ANT 來自動執行此項目中的許多任務,因此如果 ANT 也可以為我執行 config.xml 更新,那將是理想的選擇。

作為參考,這是我的 ANT 代碼,可以構建兩個 zip:

<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,但也無法正常工作。

我最接近的,因為 ANT 沒有拋出任何錯誤,是這樣的:

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

理論上,這會將指定的<access... />標記替換為空字符串,因為我省略了value屬性

不幸的是,由於failOnNoReplacements屬性以及無論出於何種原因,它都沒有進行任何替換這一事實,它失敗了。

這可能嗎? 如果是這樣,我做錯了什么?!

如果您在令牌和值中對 XML 字符串的元素進行編碼,則 Ant 替換任務將起作用...例如:

在配置中.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 -->

哈,我設法提出了一個繞過尖括號阻塞的解決方案。

在配置 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' /"
    />

這會將注釋轉換為必要的訪問標記。

我切換了我的 zip 順序,這樣 Android 現在先行,而評論仍然是評論,然后 iOS zip 進程插入訪問標簽。

在處理 xml 時,我推薦xmltask
您的需求請看: xml任務手冊更換
一點Xpath知識就派上用場了,看:
http://zvon.org/xxl/XPathTutorial/
http://www.w3schools.com/xpath/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM