【问题标题】:How to replace value of an XML field using Ant?如何使用 Ant 替换 XML 字段的值?
【发布时间】:2016-03-02 21:20:16
【问题描述】:

在 Ant 脚本中,我需要在以下 persistence.xml 文件中替换 javax.persistence.jdbc.url 属性的值。

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
    <persistence-unit name="testPU" transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <class>org.somecompany.domain.SomeEntity</class>
        <validation-mode>NONE</validation-mode>
        <properties>
            <property name="testprop" value="testval" />
        </properties>
    </persistence-unit>
</persistence>

我已经下载了 XMLTask 并尝试了以下方法:

<xmltask source="${persistence-xml-file-path}" dest="${persistence-xml-file-path}_replaced" report="true">
    <replace path="/:persistence/:persistence-unit/:properties/:property[:name/text()='testprop']/:value/text()" withText="replaced" />
</xmltask>  

很遗憾,这不起作用。我没有收到任何错误。源和目标 xml 文件的内容都出现在控制台中,并且它们是相同的。就好像上面引用的替换指令永远不会运行(或永远不会识别要更新的属性)。

=== 来自 Patrice 的回应 ====================================== ======

这似乎在没有持久性标签的模式定义的情况下工作:

<xmltask source="${persistence-xml-file-path}" dest="${persistence-xml-file-path}_replaced" report="true" failWithoutMatch="true">
<attr path="persistence/persistence-unit/properties/property[@name='testprop']" attr="value" value="replaced"/>
</xmltask>

这似乎适用于持久性标签的架构定义:

<xmltask source="${persistence-xml-file-path}" dest="${persistence-xml-file-path}_replaced" report="true" failWithoutMatch="true">
<attr path="//*[@name='testprop']" attr="value" value="replaced"/>
</xmltask>

我需要处理的属性非常独特,所以这对我来说可以正常工作,而无需检查整个属性路径。

【问题讨论】:

  • 显示您正在处理的示例 xml,看看这是否是因为任何命名空间。
  • 您的替换路径似乎不是有效的 XPath,应该更像:/persistence/persistence-unit/properties/property[@name='javax.persistence.jdbc.url']/@value
  • @Rao 我已经切换到一个简单的 xml,现在我已经将它包含在我的问题中。我还将属性和值更改为简单的字符串,以避免与特殊字符(句点、冒号)的潜在冲突。我仍然无法替换该值。

标签: xml ant xmltask


【解决方案1】:

正如@Rao 所提到的,您的问题是xpath 没有正确处理命名空间。使用“:”的语法对我来说并不一致。正如该站点上显示的许多其他 XmlTask​​ 答案一样,您需要改用 //*[local-name()='persistence'] 语法。 此外,可以使用@name 语法引用属性。 最后,如果要替换某个属性的值,不要使用&lt;replace xpath="...,使用&lt;attr xpath="...

请尝试:

<xmltask source="${persistence-xml-file-path}" dest="${persistence-xml-file-path}_replaced" report="true">
   <attr path="/*[local-name()='persistence']/*[local-name()='persistence-unit']/*[local-name()='properties']/*[local-name()='property'][@name='testprop']" attr="value" value="replaced" />
</xmltask>  

【讨论】:

  • 遇到:javax.xml.transform.TransformerException:未知节点类型:本地名称
  • 所以没有模式这似乎工作正常。我们可以提供一些通配符作为标签名称的一部分来进行匹配吗?
  • 我接受这个答案是因为 Patrice 在他的回复中包含了通配符示例并向我展示了 attr 标签。正如我的问题底部所述,这两种方法的结合对我来说都是有效的。谢谢。
  • 为狡猾的 xpath 语法道歉。我已经试探性地纠正了它。当然,感谢您接受答案。
  • 另外,FWIW,我喜欢用这个简单的在线工具来验证我的 xpath 表达式:shell-tools.net/index.php?op=xml_xpath,我推荐它。
猜你喜欢
  • 1970-01-01
  • 2012-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-30
  • 1970-01-01
  • 2010-10-11
相关资源
最近更新 更多