【问题标题】:Unexpected output when running Xmltask in ant for loop在 ant for 循环中运行 Xmltask 时出现意外输出
【发布时间】:2015-07-31 16:12:33
【问题描述】:

我正在尝试遍历目录中的一堆文件并根据它们的文件名创建一个 xml 文档。 这是代码(省略了taskdefs):

    <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] ------------------------------------------------------------

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

我真的很困惑。

【问题讨论】:

    标签: xml ant ant-contrib xmltask


    【解决方案1】:

    正如@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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 啊,是的,很好发现 - 我没有意识到你可以声明一个 'var' 并使用它来代替属性。这就解释了为什么调试不匹配输出到文件但输出仍然是错误的。连续两次调用 xmltask 似乎存在问题(不是在 for 循环中) - 可能是文件锁定?最后,我在循环中混合使用了 echo xml,在循环后使用了 xmltask 来添加 echxml 没有添加的命名空间
      猜你喜欢
      • 2018-05-08
      • 1970-01-01
      • 2018-02-04
      • 2021-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-10
      相关资源
      最近更新 更多