2014-01-21 60 views
1

我得到了一個循環訪問一些XML文件的要求,替換了其中的特定環境值並創建了一組新的XML文件。特定於環境的值將從屬性文件中獲取。我可以遍歷一個目錄來讀取所有文件,並使用xmltask替換一些特定的值,如下所示。Ant腳本通過屬性文件循環並動態替換值

<target name="updateConfig" description="update the configuration" depends="init">  
<xmltask todir="${ConfigDestDirectory}" report="false" failwithoutmatch="true"> 
     <fileset dir="${ConfigSourceDirectory}"> 
      <include name="*.xml"/>  
     </fileset>    
     <replace path="/:application/:NVPairs/:NameValuePair[:name='Connections/HTTP/HostName']/:value/text()" withXml="localhost"/>   
     </xmltask> 
    <echo>Replaced Successfully</echo> 
    </target> 

但我想通讀屬性文件並從中獲取路徑/值。 我嘗試使用屬性選擇器,屬性,var作爲這種情況下的不同選項,並設法獲取路徑而不是值。以下是屬性文件的片段和我正在使用的目標。

#DEV.properties 
HostName.xpath=/:application/:NVPairs/:NameValuePair[:name='Connections/HTTP/HostName']/:value/text() 
HostName.value=localhost 

<project name="TestBuild" default="ReadPropertyFile" basedir="."> 
    <target name="init">   
      <property file="DEV.properties"/> 
      <taskdef name="xmltask" classname="com.oopsconsultancy.xmltask.ant.XmlTask" classpath="${xmltaskPath}"/> 
      <taskdef resource="net/sf/antcontrib/antlib.xml" classpath="${antcontribPath}"/> 
      <taskdef resource="net/sf/antcontrib/antcontrib.properties"/> 
     </target> 

    <target name="ReadPropertyFile" description="update the configuration" depends="init">  
       <property file="DEV.properties" prefix="x"/>   
       <propertyselector property="propertyList" delimiter="," select="\0" match="([^\.]*)\.xpath" casesensitive="true" distinct="true"/>  
       <for list="${propertyList}" param="sequence">    
       <sequential> 
        <propertyregex property="destproperty" input="@{sequence}" regexp="([^\.]*)\." select="\1" />     
        <property name="tempname" value="${destproperty}.value" />  
        <var name="localprop" value="${tempname}"/> 
        <echo> @{sequence} </echo> 
        <echo> ${[email protected]{sequence}} </echo> 
        <echo>destproperty --> ${destproperty}</echo> 
        <echo>tempname --> ${tempname}</echo> 
        <echo> localprop --> ${localprop}</echo>  
        <echo>${x.${localprop}} </echo> <!--This is not working --> 
       </sequential>    
       </for>   
      </target> 

如果你們可以拋出一些光線,這將是非常有益的。

感謝, Venkat

回答

1

將這項工作做得更好?

我認爲你讓自己與「x」混淆了。字首。

<project name="TestBuild" default="ReadPropertyFile" basedir="."> 
    <target name="init">   
     <property file="DEV.properties"/> 
     <taskdef name="xmltask" classname="com.oopsconsultancy.xmltask.ant.XmlTask" classpath="${xmltaskPath}"/> 
     <taskdef resource="net/sf/antcontrib/antlib.xml" classpath="${antcontribPath}"/> 
     <taskdef resource="net/sf/antcontrib/antcontrib.properties"/> 
    </target> 

    <target name="ReadPropertyFile" description="update the configuration" depends="init">  
      <property file="DEV.properties" prefix="x"/>   
      <local name="propertyList"/> 
      <propertyselector property="propertyList" delimiter="," select="\1" match="x\.([^\.]*)\.xpath" casesensitive="true" distinct="true"/>  
      <for list="${propertyList}" param="sequence">    
      <sequential> 
       <echo> @{sequence} </echo> 
       <echo> @{sequence}.xpath = ${[email protected]{sequence}.xpath} </echo> 
       <echo> @{sequence}.value = ${[email protected]{sequence}.value} </echo> 
      </sequential>    
      </for>   
    </target> 
</project> 
+0

我調整了下面的腳本以使用select =「\ 1」(選擇第一個匹配)而不是select =「\ 0」選擇整個字符串)。 –

+0

嗨,帕特里斯,謝謝。它的工作完美。你說得對,我對前綴x感到困惑,對語法不太確定。直到我改變了螞蟻的版本,當地的財產纔開始工作。我現在就着手解決這個問題。 – user3218526

+0

太棒了!