2014-04-01 54 views
5

最近出現此問題。我一直在使用螞蟻,並知道我可以'繞過'這個問題,但想到問:ant是否爲這個用例提供了一個優雅的解決方案?Ant:如何在使用「過濾」複製xml文件時xml-escape屬性值

問題

當我使用Ant複製XML文件和「填充值」使用「過濾」屬性,我怎麼可以讓它自動跳脫符號(和其他XML「特殊字符」)?

語境

而不是讓安裝程序/實施者手工編輯所有不同的應用程序服務器的具體配置文件,我們有他們在我們的應用程序的根目錄編輯「build.properties」文件。螞蟻拷貝該文件的預先配置的「源」版本「目標」目錄,同時從屬性填充值的文件

1)Build.properties具有此值:

JDBC_PASSWORD=smith&wesson 

2)「源「配置文件有該元素:

<local-tx-datasource> 
    ... 
    <password>@[email protected]</password> 
    ... 
    </local-tx-datasource> 

3)螞蟻複製從‘源’配置目錄中的XML文件,並填充‘JDBC_PASSWORD’(其他場所之間)與‘過濾’屬性:

<copy todir="${appserver.home.dir}" filtering="yes"> 
    <fileset dir="${appserver.conf.dir}"> 
     <include name="**/*.xml"/> 
    </fileset> 
</copy> 

4)因爲該屬性有一個&符號,所以產生的'target'xml文件是無效的。 (在 '&' 應該是 '&安培;')

<local-tx-datasource> 
    ... 
    <password>smith&wesson</password> 
    ... 
    </local-tx-datasource> 

所需的結果

代替4,我想這樣的:

<local-tx-datasource> 
    ... 
    <password>smith&amp;wesson</password> 
    ... 
    </local-tx-datasource> 

附加

我需要擔心整個角色扮演ters',即小於,大於等,以及和號。

在此先感謝

+0

我有同樣的問題。你是如何解決你的?你寫了一個自定義編碼器嗎?謝謝。 –

回答

0
JDBC_PASSWORD=smith&amp;wesson 

將導致:

<local-tx-datasource> 
    <password>smith&amp;wesson</password> 
</local-tx-datasource> 

將得到解析爲:

<local-tx-datasource> 
    <password>smith&wesson</password> 
</local-tx-datasource> 


JDBC_PASSWORD=smith&amp;amp;wesson 

將導致:

<local-tx-datasource> 
    <password>smith&amp;amp;wesson</password> 
</local-tx-datasource> 

將得到解析爲:

<local-tx-datasource> 
    <password>smith&amp;wesson</password> 
</local-tx-datasource> 

類似:

less-than : &lt;

greater-than : &gt;

0

您可以使用Ant-的Contrib任務URLEncode(是的,它說:的foreach上的標題,但這只是扔關古道)。

您可以使用它來確保您通過<filterset/>傳遞給標記化XML文件的任何值格式正確。

您必須爲Ant-Contrib任務定義<taskdef/>幷包含Ant Contrib jar。

+0

URL編碼與XML編碼不同。這是正確的方向,我相信一個人需要一個自定義編碼器。 – user331465

0

如果您未更換屬性值,則始終可以使用CDATA部分。 CDATA中的和號,小於等等不需要實體轉義。

<local-tx-datasource> 
    ... 
    <password><![CDATA[@[email protected]]]></password> 
    ... 
</local-tx-datasource>