2015-05-19 58 views
1

我想迭代一个目录中的一堆文件,并从它们的文件名创建一个xml文档。 下面的代码(任务定义中省略): 当在Ant中运行Xmltask for循环时出现意外的输出

<target name="test1"> 

     <for param="file"> 
      <path> 
       <fileset dir="${basedir}/schemas" includes="*.xsd" /> 
      </path> 
      <sequential> 
       <echo message="found file [email protected]{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] ------------------------------------------------------------ 

这表明第一遍是正确的:它找到了“种子”条目(动物)加上刚添加的(分支)。 调试输出看起来像第二遍没有发生,因为它与第一次相同,但是当我在脚本完成时看到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

Ant属性是不可变的 - ${mymess}的值在第一次加载文件内容时不会更改。由于您使用的蚂蚁的contrib,您可以使用var任务加载之前取消设置属性:

<var name="mymess" unset="true" /> 
<loadfile property="mymess" srcFile="wiki.xml"/> 
+0

啊,是的,很好的发现 - 我没有意识到你可以声明一个'var'并用它来代替一个属性。这就解释了为什么调试与输出文件不匹配,但输出仍然是错误的。似乎有一个问题在连续两次调用xmltask(而不是for循环) - 也许文件锁定?最后,我使用循环中的echo xml和xmltask的混合来添加echxml不添加的命名空间 –

0

据报道由@manouti,用于调试你在一个循环中重复使用一个不变的属性,因此它的价值获得了”改变。 简单的解决方案:使用“本地”蚁的任务,例如:

  <echo message="------------------------------"/> 
      <local name="mymess"/> <!-- declares a local scope for "mymess" --> 
      <loadfile property="mymess" 
       srcFile="wiki.xml"/> 
      <echo message="${mymess}"/> 
      <echo message="------------------------------"/> 

你的第二个问题与您的XPath语法的事,你问xmltask插入每个预现有的“出口”节点之后的节点。因此,第二次插入两次。 相反,你想:

   <insert path="//exported[last()]" position="after"> 

看到这个other SO question的实例。