最近出现了这个问题。我一直在使用蚂蚁,并且知道我可以在周围徘徊。这个问题,但是想问一下:蚂蚁是否为这个用例提供了一个优雅的解决方案?
问题
当我使用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&wesson</password>
...
</local-tx-datasource>
其他
我需要担心整个人物的角色,即小于,大于等,以及&符号。
提前致谢
答案 0 :(得分:0)
JDBC_PASSWORD=smith&wesson
将导致:
<local-tx-datasource>
<password>smith&wesson</password>
</local-tx-datasource>
将被解析为:
<local-tx-datasource>
<password>smith&wesson</password>
</local-tx-datasource>
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>
相似:
less-than : <
greater-than : >
答案 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="&" to="&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>
您可能需要调整上述内容以适合您的实际属性名称等,但这应该可以帮助您。