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

looping through an xml file combining lists in ANT

我有这个xml:

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

我想用ant循环遍历项目,当action是D时执行一段代码,当action不是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}

我知道我有 2 个单独的列表,但我没有在结果中执行操作。我需要遍历 xml 文件,使 属性 都可用(项目名称和操作)作为参数传递给下一个目标。

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

具有嵌套操作的 xmltask => 运行 xpath 表达式的每个匹配项的操作任务容器中包含的所有任务 (本例中的属性操作 = 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 calling ant target for every match xpath expression (attribute action != 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>