在 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>
我有这个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>