2011-08-20 138 views
2

我有一個帶有不同擴展名的XML文件的子目錄。ANT:根據XML文件內容替換一組XML文件中的參數


開始更新部分的


目標目錄:/some/path

目標文件面膜:*.load

基本filterset我們用它來尋找/some/path*.load文件:

<fileset dir="/some/path"> 
    <include name="**/*.load" /> 
</fileset> 

還有可能在/some/path下有多個子目錄,還有多個*.load文件。

但是我們需要在示例中描述的基於XML內容和參數的增強過濾,下面的用例。

實例:

load_file1.load:

<load 
    id="0a0740d1fc1a33a28f1397b76cae48bc" 
    order="9" 
    enable="true" 
    name="Load name 1" 
    type="LoadType.custom"> 
    <parent /> 
    <default-property name="Property2" 
         type="java.lang.Integer" 
         value="0" /> 
    <default-property name="Property1" 
         type="java.lang.Boolean" 
         value="false" /> 
</load> 

load_file2.load:

<load 
     id="ec9ca08d11ca34b42e13c5f21578d82c" 
     name="Load name 2" 
     order="0" 
     enable="true" 
     type="LoadType.base"> 
    <parent /> 
    <default-property name="Load name 1" 
         type="java.lang.String" 
         value="test3" /> 
    <default-property name="Property2" 
         type="java.lang.Integer" 
         value="0" /> 
    <!-- here could be any number of other sub-properties --> 
    <date-range end-date="1/31/1900" 
        start-date="1/31/1900" /> 
</load> 

輸入數據:

螞蟻PARAM:Load_name = "Load name 1" - 用於查找相應的文件

螞蟻PARAM:Load_param_name_replace = "enable"

螞蟻PARAM:Load_param_value_replace = "false"

NB!我們始終立足於在他們裏面//load/@name屬性(硬編碼)的值,搜索文件:

<load 
     id="ec9ca08d11ca34b42e13c5f21578d82c" 
     name="Load name 2" 
     order="0" 
     enable="true" 
     type="LoadType.base"> 

問題(基於示例文件的上面):

  1. 我們應該找到文件其中//load/@name = $Load_name ANT參數(「加載名稱1」)

  2. 我們應該更改找到的文件(可能是多個LE)XML屬性在$Load_param_name_replace ANT參數( 「使 」)值聲明爲ANT PARAM $Load_param_value_replace(「 」)

預期結果的價值:

  1. 文件( s)找到:load_file1.load

注意!請注意,在load_file2.load我們有<default-property name="Load name 1" ...匹配組合name="Load name 1",但我們需要區分這個無效的案例和有效的文件load_file1.load

  1. 在找到的文件(S)load_file1.load XML屬性在$Load_param_name_replace定義(」 啓用 「)下//load節點ANT PARAM應改爲在ANT PARAM定義的新值$Load_param_value_replace(」 「)

所以ANT任務的文件load_file1.load後應看:

<load 
    id="0a0740d1fc1a33a28f1397b76cae48bc" 
    order="9" 
    enable="false" 
    name="Load name 1" 
    type="LoadType.custom"> 
    <parent /> 
    <default-property name="Property2" 
         type="java.lang.Integer" 
         value="0" /> 
    <default-property name="Property1" 
         type="java.lang.Boolean" 
         value="false" /> 
</load> 

末更新部分


的正如你所看到的XML文件的內容是通過多條線路傳播 - 這對我來說是棘手的部分。

我們試圖ANT fileset目標與containsregexp過濾器哪裏有name="load_name1"但沒有成功搜索多正則表達式。我們使用multiline=truesingleline=true - 也沒有工作。

之後,我們嘗試XML任務 - 但沒有足夠的例子來說明如何取代基於fileset的多個.XML文件中的xml屬性。

所以,如果你可以提供幾個例子 - 它會很棒!

回答

1

全面修訂更新後問題描述:

<project> 
<taskdef name="xmltask" classname="com.oopsconsultancy.xmltask.ant.XmlTask"/> 

<property name="editno" value='&lt;default-property name="Load name 1"'/> 
<property name="edityes" value='name="Load name 1"'/> 
<property name="editxpath" value="//load/@enable"/> 
<property name="editnew" value="false"/> 

<xmltask todir="/some/path" report="true"> 
    <fileset dir="/some/path"> 
    <include name="**/*.load"/> 
    <not> 
    <contains text="${editno}" casesensitive="true"/> 
    </not> 
    <contains text="${edityes}" casesensitive="true"/> 
    </fileset> 
    <replace path="${editxpath}" withText="${editnew}"/> 
    </xmltask> 
</project> 

對的文件集的內容進行快速檢查只需使用內置的屬性$ {的toString:filesetid}

<fileset dir="/some/path" id="foobar"> 
    <include name="**/*.load" /> 
    <not> 
    <contains text="${editno}" casesensitive="true" /> 
    </not> 
    <contains text="${edityes}" casesensitive="true" /> 
</fileset> 

<echo>${toString:foobar}</echo> 

看到螞蟻手冊Properties and PropertyHelpers

+0

thx。還有一點 - 我們不能驗證XML文件中是否存在字符串「name ='value'」,因爲它的結構可能更加棘手,我們可能還有其他節點,而不僅僅是根節點,它的鍵值如「na​​me = '值'」。所以我們想要確定的是,我們檢查該參數是否爲根節點。 – zmische

+0

我更新了一個問題的例子。這就是爲什麼我們首先在內嘗試了正則表達式。 – zmische

+0

你更新更棘手的例子有點令人困惑:[1。] \\ load \ @name不是有效的xpath表達式,有效表達式// load/@ name會產生load_name2 [2.]你搜索name =「whatever 「只作爲來自加載標籤的屬性,而不是來自屬性標籤的屬性,對吧? – Rebse

1

使用Ant任務XSLT應用像下面這樣的變換:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="xml" indent="yes"/> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="load[@name='load_name1']"> 
     <xsl:copy> 
      <xsl:attribute name="from">date2</xsl:attribute> 
      <xsl:apply-templates select="@*[name()!='from']"/> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

這使得您輸入的副本,更換匹配name="load_name1"標籤的from屬性。請注意,這可能會改變縮進,但無論輸入如何格式化都可以工作,這對於正則表達式來說可能是不可能的。

+0

Thx例如。我們也試試這個! – zmische

+0

@zmische - 要使用這個樣式表和更棘手的示例,您必須將「apply-templates」從'] |節點更改爲'