2013-01-22 64 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的链接 - 比我链接到的官方文档更好的教程。 –

相关问题