1

我正在尝试遍历目录中的一堆文件并从它们的文件名创建一个 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 记录(调试中丢失了),而且还写了两次!

我真的很困惑。

4

2 回答 2

0

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

<var name="mymess" unset="true" />
<loadfile property="mymess" srcFile="wiki.xml"/>
于 2015-05-19T17:42:40.237 回答
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">

例如,请参阅这个其他 SO 问题

于 2015-05-20T20:12:31.813 回答