我有这个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文件,该文件具有可用的属性(项目名称和操作),以作为参数传递给下一个目标。
答案 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>