2013-01-22 100 views
4

我一樣有如下一個xml:如何到<foreach>在<macrodef>?

<data> 

    <foo>value1</foo> 

    <foo>value2</foo> 

    <foo>value3</foo> 

    </data> 

我想創建macrodef它實現以下功能:

<?xml version="1.0"?> 
<project name="OATS" default="execute" basedir="."> 

    <xmlproperty file="data.xml" collapseAttributes="true"/> 
    <target name="execute"> 
    <foreach list="${data.foo}" target="runScript" param="script"/> 
    </target> 
    <target name="runScript"> 
    <echo>Doing things with ${script}</echo> 
    </target> 
</project> 

任何人都知道如何?提前致謝。

回答

0

下面的示例使用groovy ANT task

<project name="OATS" default="execute" basedir="."> 

    <taskdef name="groovy" classname="org.codehaus.groovy.ant.Groovy"> 
     <classpath> 
      <pathelement location="lib/groovy-all-2.1.0-rc-2.jar"/> 
     </classpath> 
    </taskdef> 

    <target name="execute"> 
     <groovy> 
      def data = new XmlSlurper().parse(new File("data.xml")) 

      data.foo.each { 
       properties["script"] = it 
       ant.project.executeTarget("runScript") 
      } 
     </groovy> 
    </target> 

    <target name="runScript"> 
     <echo>Doing things with ${script}</echo> 
    </target> 

</project> 
+0

嗨馬克。謝謝。我的意思是不執行'macrodef'中的'targe'。我找到了一種方法,選擇使用而不是。 – user2000015

0

這是我的macrodef。

<?xml version="1.0" encoding="UTF-8"?> 
    <project name="OATS" default="test" basedir="."> 
     <property environment = "env"/> 
     <path id = "antcontrib.path"> 
     <fileset file = "${env.ANT_HOME}/../net.sf.antcontrib_1.1.0.0_1-0b2/lib/ant-contrib.jar"/> 
     </path> 
     <taskdef resource="net/sf/antcontrib/antlib.xml" classpathref="antcontrib.path"/> 
     <macrodef name="runOATS"> 
      <attribute name="suite"/> 
      <attribute name="toDir"/> 
      <sequential> 
       <delete dir="@{toDir}"/> 
       <mkdir dir="@{toDir}"/> 
       <xmlproperty file="@{suite}" collapseAttributes="true"/> 
       <for list="${data.foo}" param="script"> 
        <sequential> 
         <runScript script="@{script}"/> 
        </sequential> 
       </for> 
      </sequential> 
     </macrodef>    
     <macrodef name="runScript"> 
      <attribute name="script"/> 
      <sequential> 
       <echo>Doing things with @{script}</echo> 
      </sequential> 
     </macrodef> 
     <target name="test"> 
      <runOATS toDir="/OATS/results" suite="data.xml"/> 
     </target> 
</project> 
3

xmltask是在螞蟻社區用於此目的的最佳選擇,而你沒有定義自己的macrodef。

因此,例如:

<tools:xmltask source="data.xml" report="false" > 
    <tools:call path="data/foo"> 
     <param name="value" path="text()"/> 
     <actions> 
      <echo>Doing things with @{value}</echo> 
     </actions> 
    </tools:call> 
    </tools:xmltask> 

我建議您閱讀用戶手冊,爲xmltask有很多的選擇。它基本上支持XPath來提取和迭代你的XML的任何部分。除了匿名代碼塊外,它還支持對現有目標的調用(如示例中所示)。

這很難被擊敗。

+1

+1 xmltask與oopsconsultancy結合xpath是任何xml驅動構建(即基於xmlproperty文件)的最佳選擇。除了xmltask網站上的文檔外,建議使用http://today.java.net/pub/a/today/2006/11/01/xml-manipulation-using-xmltask.html教程。 – Rebse

+0

感謝@Rebse的鏈接 - 比我鏈接到的官方文檔更好的教程。 –

相關問題