我们需要从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内的属性。
此文件正在注入数据库,现在不可用。
答案 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文件的副本。非常凌乱,难以维护,但我想我会发布它。