我正在尝试迭代目录中的一堆文件,并从其文件名创建一个xml文档。 这是代码(省略了taskdef):
<target name="test1">
<for param="file">
<path>
<fileset dir="${basedir}/schemas" includes="*.xsd" />
</path>
<sequential>
<echo message="found file .....@{file}" />
<xmltask source="wiki.xml" dest="wiki.xml" outputter="simple:4">
<insert path="//exported" position="after">
<![CDATA[
<exported Id="@{file}" />
]]>
</insert>
</xmltask>
<echo message="------------------------------"/>
<loadfile property="mymess"
srcFile="wiki.xml"/>
<echo message="${mymess}"/>
<echo message="------------------------------"/>
</sequential>
</for>
</target>
</project>
初始源文件wiki.xml如下所示:
<top>
<exported Id="Animal_v1"></exported>
</top>
这是调试输出:
test1:
[echo] found file .....C:\temp\BranchBS_v1.xsd
[echo] ------------------------------------------------------------
[echo] <?xml version="1.0" encoding="UTF-8" standalone="no"?>
[echo]
[echo] <top>
[echo] <exported Id="Animal_v1"></exported>
[echo] <exported Id="C:\temp\schemas\BranchBS_v1.xsd"></exported>
[echo] </top>
[echo]
[echo] ------------------------------------------------------------
[echo] found file .....C:\temp\schemas\CalendarEvent_v1.xsd
[echo] ------------------------------------------------------------
[echo] <?xml version="1.0" encoding="UTF-8" standalone="no"?>
[echo]
[echo] <top>
[echo] <exported Id="/Animal_v1"></exported>
[echo] <exported Id="C:\temp\schemas\BranchBS_v1.xsd"></exported>
[echo] </top>
[echo]
[echo] ------------------------------------------------------------
这表明第一遍是正确的:它找到了种子&#39;条目(动物)加上刚添加的(分支)。 调试输出看起来像第二次传递没有发生,因为它与第一次传递相同,但是当我在脚本完成时实际查看wiki.xml的内容时,它看起来像这样:
<top>
<exported Id="Animal_v1"></exported>
<exported instanceId="C:\temp\schemas\CalendarEvent_v1.xsd"></exported>
<exported instanceId="C:\temp\schemas\BranchBS_v1.xsd"></exported>
<exported instanceId="C:\temp\schemas\CalendarEvent_v1.xsd"></exported>
</top>
因此它不仅编写了CalendarEvent记录(调试中缺少),而且还执行了两次!
我真的很困惑。
答案 0 :(得分:0)
Ant属性是不可变的 - ${mymess}
的值在第一次加载文件内容时不会改变。由于您使用的是ant-contrib,因此可以在使用var
任务加载之前取消设置该属性:
<var name="mymess" unset="true" />
<loadfile property="mymess" srcFile="wiki.xml"/>
答案 1 :(得分:0)
正如@manouti报道的那样,对于调试,你在循环中重用不可变属性,因此它的值不会发生变化。 简单的解决方案:使用&#39; local&#39;蚂蚁任务,例如:
<echo message="------------------------------"/>
<local name="mymess"/> <!-- declares a local scope for "mymess" -->
<loadfile property="mymess"
srcFile="wiki.xml"/>
<echo message="${mymess}"/>
<echo message="------------------------------"/>
你的第二个问题与你的xpath语法有关,你要求xmltask在每个预先存在的&#34;导出&#34;之后插入一个节点。节点。因此,第二次,你插入两次。 相反,你想要:
<insert path="//exported[last()]" position="after">
例如,见other SO question。