如何在exec ant任务中传递xml文本作为参数?

时间:2009-10-06 22:44:25

标签: xml ant escaping

我们需要从ant调用一个可执行文件,它将xml作为参数的一部分。使用exec很简单,但其中一个参数包含一个xml文件。我们尝试使用带有striplinebreaks

的loadfile目标加载xml文件
<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标签的value属性(这些可能不包含在最终命令中吗?)。

一个用于表示嵌套字符串的arg标记内。

一个用于xmlStuff内的属性。

此文件正在注入数据库,现在不可用。

3 个答案:

答案 0 :(得分:2)

value标记的arg属性值中的双引号似乎会导致Windows出现问题(但不会出现在Linux上;使用Ant 1.7.1进行测试)。

如果在其他平台上破解不是一个问题,我想一个粗略的解决方法可能只是逃避最终在命令行上的引号。您可以通过向filterchain添加以下过滤器来执行此操作:

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

修改:在您自己的answer中,您会发现“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字符串文字中,则应至少考虑转义撇号。

答案 1 :(得分:0)

尝试将XML放入CDATA部分:

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

答案 2 :(得分:0)

我们在此期间一直使用的解决方法是使用基于文件的参数而不是“theCommand”的命令行参数(实际上是postgresql的psql命令)并手动添加“其他一些信息...”(实际上是一个插入查询)到xml文件的副本。非常凌乱,难以维护,但我想我会发布它。