2009-10-06 34 views
1

我们需要从ant中调用一个可执行文件,它将xml作为参数的一部分。使用exec很容易,但其中一个参数包含一个xml文件。我们试图加载使用与striplinebreaks如何在exec蚂蚁任务中将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文档在这种情况下使用的方式的loadFile目标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内的属性。

此文件被注入到数据库中,现在不可用。

+0

你是什么意思“突破arg标签”?什么是你正在得到确切的错误信息?在可执行文件修复冒号后尝试使用可执行文件,这些文件只是回应它的参数,对我来说工作的很好。 – 2009-10-25 08:12:56

+0

感谢结肠。 我已经更新的问题了一点,但评估后$ {} xmlStuff的ARG标签看起来像: ” /> 嵌入式XML是大问题。 – Adam 2009-10-26 16:32:05

+0

您确定扩展为包含尖括号的值的变量实际上是您的问题吗?据我了解,Ant解析XML后扩展了变量引用,所以它不会影响解析。我试着用你的例子,它对我有用。你究竟测试了什么,你得到了什么错误? – 2009-11-04 21:37:01

回答

2

arg标签的value属性值双引号似乎导致Windows的问题(但不能在Linux上;用Ant 1.7进行测试。 1)。

如果打破其他平台不是一个问题,我想粗略的解决方法可能只是逃避最终在命令行上的引号。你可以通过添加下面的过滤器,以你的filterchain例如这样做:

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

编辑:在自己answer您揭示“theCommand”其实psql。由于它可以使用-f开关从文件读取查询,因此使用临时文件确实是避免命令行故障的最简单方法。但是,如果要将XML文件内容插入到SQL字符串文字中,则至少应考虑逃避撇号。

+0

会有什么办法来强制蚂蚁不要在最终命令的arg周围使用引号吗?我发现这是真正的重头戏,因为我不能改变“theCommand” – Adam 2009-11-12 16:08:17

+0

使用'line'属性而不是'value'可以让你指定一个以空格分隔的命令行参数列表:''这样它不会在那里添加引号,但是你可以通过空格将值分割成不同的参数。 – 2009-11-12 21:47:28

+0

谢谢jackem,这就是我需要的! – Adam 2009-12-04 19:35:37

0

尝试把XML在CDATA节:

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

我不认为你明白,我想剥线。问题是文件的内容。我尝试在arg的value属性中放置CDATA,但这在ANT中是不允许的。 – Adam 2009-10-07 15:26:13

+0

您不能将XML包含在CDATA节中作为arg标记的文本值 - 即 cdata节xml? – 2009-10-07 15:37:10

+0

Arg不支持嵌套文本。 错误: 类org.apache.tools.ant.types.Commandline $参数 不支持嵌套的文本数据 – Adam 2009-10-07 15:44:52

0

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