2015-05-19 2 views
1

Я пытаюсь перебрать кучу файлов в каталог и создать XML-документ из их имен файлов. Вот код (taskdefs опущен): Неожиданный вывод при запуске Xmltask в ant for loop

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

Это показывает, что первый проход был правильным: он обнаружил запись «семя» (Animal) плюс добавленный (Branch). выхода отладки выглядит второй проход не произошло, потому что это то же самое, как первые, но когда я на самом деле смотреть на контент с из 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} не изменится после первого его загрузки содержимым файла. Так как вы используете АНТ-вно, вы можете сбросить свойство перед загрузкой с помощью var задачи:

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

Ах да, хорошо заметили - я не знал, что вы можете объявить «var» и использовать его вместо свойства. Это объясняет, почему отладка не соответствует выходному файлу, но результат по-прежнему не соответствует действительности. Кажется, проблема связана с вызовом xmltask дважды подряд (не для цикла) - возможно, блокировка файлов? В конце я использовал смесь echo xml в цикле и xmltask после цикла, чтобы добавить пространства имен, которые echxml не добавляет –

0

Как сообщает @manouti, для отладки вы повторно неизменяемое свойство в цикле, следовательно, его значение выиграл» t изменение. Простое решение: использовать «локальный» муравей задачи, например:

  <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, например.