Ant:使用“过滤”复制xml文件时如何使用xml-escape属性值

时间:2014-04-01 21:02:02

标签: xml ant

最近出现了这个问题。我一直在使用蚂蚁,并且知道我可以在周围徘徊。这个问题,但是想问一下:蚂蚁是否为这个用例提供了一个优雅的解决方案?

问题

当我使用ant复制xml文件和"填充值"使用"过滤"属性,如何让它自动转换为&符号(以及其他xml'特殊字符')?

上下文

我们让他们编辑一个' build.properties'而不是让安装程序/实现者手动编辑所有各种特定于应用程序服务器的配置文件。我们的应用程序的根目录中的文件。 Ant会复制预先配置的“来源”。该文件的版本为' target'目录,同时填充属性文件中的值

1)Build.properties具有以下值:

JDBC_PASSWORD=smith&wesson

2)"来源"配置文件有这个元素:

  <local-tx-datasource>
    ...
    <password>@JDBC_PASSWORD@</password>
    ...
  </local-tx-datasource>

3)Ant复制来自&#39;来源的xml文件。配置目录并填充&#39; JDBC_PASSWORD&#39; (以及其他属性)使用&#39;过滤&#39;属性:

<copy todir="${appserver.home.dir}" filtering="yes">
   <fileset dir="${appserver.conf.dir}">
      <include name="**/*.xml"/>
   </fileset>
</copy>

4)因为该物业有一个&符号,所以&#39;目标&#39; xml文件无效。 (&#39;&amp;&#39;应该是&#39;&amp; amp;&#39;)

  <local-tx-datasource>
    ...
    <password>smith&wesson</password>
    ...
  </local-tx-datasource>

期望的结果

而不是4,我想这样:

  <local-tx-datasource>
    ...
    <password>smith&amp;wesson</password>
    ...
  </local-tx-datasource>

其他

我需要担心整个人物的角色,即小于,大于等,以及&符号。

提前致谢

4 个答案:

答案 0 :(得分:0)

 JDBC_PASSWORD=smith&amp;wesson

将导致:

 <local-tx-datasource>
  <password>smith&amp;wesson</password>
 </local-tx-datasource>

将被解析为:

 <local-tx-datasource>
  <password>smith&wesson</password>
 </local-tx-datasource>


JDBC_PASSWORD=smith&amp;amp;wesson

将导致:

 <local-tx-datasource>
  <password>smith&amp;amp;wesson</password>
 </local-tx-datasource>

将被解析为:

 <local-tx-datasource>
  <password>smith&amp;wesson</password>
 </local-tx-datasource>

相似:

less-than : &lt;

greater-than : &gt;

答案 1 :(得分:0)

您可以使用Ant-Contrib任务URLEncode(是的,它在标题上显示 Foreach ,但这只是为了 热量 离开小道。)。

您可以使用它来确保您通过<filterset/>传递给标记化XML文件的任何值都已正确格式化。

您必须为Ant-Contrib任务定义<taskdef/>并包含Ant Contrib jar。

答案 2 :(得分:0)

如果您不替换属性值,则可以始终使用CDATA部分。 CDATA中的&符号,小于等等不需要实体转义。

<local-tx-datasource>
  ...
  <password><![CDATA[@JDBC_PASSWORD@]]></password>
  ...
</local-tx-datasource>

答案 3 :(得分:0)

将您的问题与another SO answer放在一起可以获得您想要的效果。

首先,转换属性值:

<loadresource property="jdbc.password.escaped">
  <propertyresource name="jdbc.password"/>
  <filterchain>
    <tokenfilter>
      <replacestring from="&amp;" to="&amp;amp;"/><!-- note: double escape -->
    </tokenfilter>
  </filterchain>
</loadresource>

现在,使用更新的属性值:

<filter token="JDBC_PASSWORD" value="${jdbc.password.escaped}" />

<copy todir="${appserver.home.dir}" filtering="yes">
<fileset dir="${appserver.conf.dir}">
    <include name="**/*.xml"/>
  </fileset>
</copy>

您可能需要调整上述内容以适合您的实际属性名称等,但这应该可以帮助您。