Как передать текст XML в качестве аргумента в задачу exec ant? - PullRequest
1 голос
/ 07 октября 2009

Нам нужно вызвать исполняемый файл из ant, который принимает xml в качестве аргумента. Использовать exec достаточно просто, но один из аргументов включает файл xml. Мы попытались загрузить файл XML с помощью цели loadfile с помощью striplinebreaks

<loadfile property="xmlStuff" srcFile="xmlFile.xml">
   <filterchain>
     <striplinebreaks/>
   </filterchain>
</loadfile>
<exec executable="theCommand">
   <arg value="Some other information and now our xml: '${xmlStuff}'" />
</exec>   

Есть ли способ, которым мы можем читать и экранировать XML-документы для использования в этом случае?

РЕДАКТИРОВАТЬ, поскольку xmlStuff имеет кавычки для своих атрибутов, которые заканчиваются кавычками атрибута arg valute.

Итак, приведенный выше пример выглядит так:

theCommand "Some other information and now our xml: '<outerTag myAtt="foobar"> <innerTag /> </outerTag>'"

Вместо:

theCommand Some other information and now our xml: '<outerTag myAtt="foobar"> <innerTag /> </outerTag>'

Есть ли способ по существу иметь три слоя цитат?

Один для атрибута значения тега arg (возможно, они не включены в последнюю команду?).

Один внутри тега arg для представления вложенной строки.

Один для внутри xmlStuff для атрибутов внутри.

Этот файл внедряется в базу данных и сейчас недоступен.

Ответы [ 3 ]

2 голосов
/ 12 ноября 2009

Двойные кавычки в значении атрибута value тега arg, похоже, вызывают проблемы в Windows (но не в Linux; протестировано с Ant 1.7.1).

Если поломка на других платформах не является проблемой, я полагаю, что грубый обходной путь мог бы просто избегать кавычек, которые заканчиваются в командной строке. Вы можете сделать это, например, добавив следующий фильтр к вашему filterchain:

<tokenfilter>
  <replacestring from='"' to='\"'/>
</tokenfilter>

Редактировать: В своем собственном ответе вы обнаружите, что "theCommand" на самом деле psql. Поскольку он может прочитать запрос из файла с помощью переключателя -f, использование временного файла - действительно самый простой способ избежать проблем с командной строкой.

<tempfile property="temp.file" deleteonexit="true" />
<echo file="${temp.file}"
      message="Some other information and now our xml: '${xmlStuff}'" />
<exec executable="psql">
  <arg value="-f" />
  <arg file="${temp.file}" />
</exec>
<delete file="${temp.file}" />

Тем не менее, если вы вставляете содержимое файла XML в строковый литерал SQL, вам следует рассмотреть как минимум экранирование от апострофов.

0 голосов
/ 12 ноября 2009

Обходной путь, который мы использовали в это время, состоял в том, чтобы использовать аргумент на основе файла вместо аргумента командной строки для «theCommand» (фактически команды psql из postgresql) и вручную добавить «Некоторую другую информацию ...» ( на самом деле запрос вставки) в копию файла XML. Очень грязный и сложный в обслуживании, но я думал, что выложу его.

0 голосов
/ 07 октября 2009

Попробуйте поместить XML в раздел CDATA:

<loadfile
  property="xmlStuff"
  srcFile="xmlFile.xml">
<![CDATA[
  <filterchain>
    <striplinebreaks/>
  </filterchain>
]]>
</loadfile>
...