循环遍历ANT中的列表组合的xml文件

时间:2015-02-26 10:50:12

标签: xml for-loop ant ant-contrib

我有这个xml:

<?xml version="1.0" encoding="UTF-8"?>
<projects>
  <project action="D">Project1</project>
  <project action="M">Project2</project>
</projects>

我想使用ant来循环项目并在动作为D时执行一段代码,并在动作不是D时执行另一段代码。

到目前为止我的进展是:

<target name="test">
  <xmlproperty file="changeList.xml"/>
  <for list="${projects.project}" param="project">
    <sequential>
      <echo>The project name is @{project} Action @{project.action}</echo>
    </sequential>
  </for>
</target>

结果现在是:

 [echo] Project name is Project1 Action is @{project.action}
 [echo] Project name is Project2 Action is @{project.action}

我知道我有两个单独的列表,而且我没有在结果中获得操作。我需要循环访问我的xml文件,该文件具有可用的属性(项目名称和操作),以作为参数传递给下一个目标。

1 个答案:

答案 0 :(得分:1)

使用ant插件任务xmltask,您有两种可能性。

带有嵌套操作的

xmltask =&GT;为xpath表达式的每个匹配运行操作任务容器中包含的所有任务 (在此示例中属性action = D):

<project>
 <!-- Import XMLTask -->
 <taskdef name="xmltask" classname="com.oopsconsultancy.xmltask.ant.XmlTask"/>

 <!-- loop over all projects with attribute action=D --> 
 <xmltask source="changeList.xml">
  <call path="//projects/project[@action='D']">
   <param path="text()" name="projname"/>
   <!-- define other params if needed .. -->
   <param value="bar" name="foo"/>
   <!-- inside action adress params with @{..} syntax ! -->
    <actions>
      <echo>Action D => @{projname}${line.separator}Param @@{foo} => @{foo}</echo>
   </actions>
  </call>
 </xmltask>

</project>

xmltask为xpath表达式的每个匹配调用ant目标(属性操作!= D 在这个例子中) 在这种情况下,您必须使用目标中的xmltask(此片段中的目标main) 你会得到BuildFailed => xmltask task at the top level must not invoke its own build file

<project  default="main">
 <!-- Import XMLTask -->
 <taskdef name="xmltask" classname="com.oopsconsultancy.xmltask.ant.XmlTask"/>

<target name="main">
 <xmltask source="changeList.xml">
  <call path="//projects/project[@action != 'D']" target="foo">
   <param path="text()" name="projname"/>
   <param value="bar" name="foo"/>
  </call>
 </xmltask>
</target>

<!-- you have to use the propertysyntax ${...} in the called target
     for the params ! -->

<target name="foo">
 <echo>
 ${projname} => Action != D
 Param $${foo} is ${foo}
 </echo>
</target>

</project>