2015-05-19 100 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的實例。