Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在exec ant任务中将xml文本作为参数传递?_Xml_Ant_Escaping - Fatal编程技术网

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

如何在exec ant任务中将xml文本作为参数传递?,xml,ant,escaping,Xml,Ant,Escaping,我们需要从ant调用一个将xml作为参数一部分的可执行文件。使用exec非常简单,但其中一个参数包含一个xml文件。我们尝试使用带striplinebreaks的loadfile目标加载xml文件 <loadfile property="xmlStuff" srcFile="xmlFile.xml"> <filterchain> <striplinebreaks/> </filterchain> </loadfile&g

我们需要从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>'"
command“一些其他信息,现在是我们的xml:”
而不是:

theCommand Some other information and now our xml: '<outerTag myAtt="foobar"> <innerTag /> </outerTag>'
command提供了一些其他信息,现在是我们的xml:'
有没有办法基本上有三层引号?

一个用于arg标记的value属性(这些可能不包括在最终命令中吗?)

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

一个用于xmlStuff中的属性


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

尝试将XML放入CDATA部分:

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

]]>

arg
标记的
value
属性的值中,双引号似乎会在Windows上引起问题(但在Linux上不是这样;使用Ant 1.7.1测试)

如果在其他平台上中断不是一个问题,我想一个粗糙的解决方法可能只是避开命令行上的引号。例如,您可以通过将以下筛选器添加到
筛选器链

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

不过,如果将XML文件内容插入到SQL字符串文本中,则应该至少考虑省略撇号。p> 我们在此期间一直在使用的一种解决方法是使用基于文件的参数,而不是“theCommand”(实际上是postgresql的psql命令)的命令行参数,并手动将“Some other info…”(实际上是插入查询)添加到xml文件的副本中。非常凌乱,很难维护,但我想我会发布它。

我想你不明白,我想要脱衣舞表演。问题是文件的内容。我尝试在arg的value属性中的文本周围放置CDATA,但在ANT中不允许这样做。您不能将XML作为arg标记的文本值包含在CDATA节中吗?例如,CDATA节包含XML?arg不支持嵌套文本。错误:class org.apache.tools.ant.types.Commandline$参数不支持嵌套文本数据“打破arg标记”是什么意思?您得到的确切错误消息是什么?在修复了可执行文件后的冒号并尝试使用一个只回显其参数的可执行文件后,对我来说效果很好。谢谢冒号。我已经更新了一点这个问题,但是在计算${xmlStuff}之后,arg标记看起来会是这样的:嵌入的xml是一个大问题。您确定扩展到包含尖括号的值的变量实际上是您的问题吗?据我所知,Ant在解析XML后会扩展变量引用,因此不会影响解析。我试过用你的例子,它确实对我有用。你到底是如何测试的?你犯了什么错误?没错,测试用例似乎正在运行。我使用与生产中相同的格式创建了它。我将再次尝试在生产环境中进行测试,并发布错误以及我的示例和生产环境之间的差异。好的,所以问题似乎实际上是引号没有按照预期的方式转义。我会适当地更新这个问题。生产中的错误消息来自命令,说明参数太多。是否有任何方法可以强制ant在最终命令中不要在arg周围使用引号?我发现这才是真正的关键,因为我不能用
属性而不是
来更改“命令”,它允许您指定一个以空格分隔的命令行参数列表:
这样它就不会在其中添加引号,但可以用空格将值拆分为不同的参数。
<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}" />