如何使用 Ant 替换 XML 字段的值?
How to replace value of an XML field using Ant?
在 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>
我需要处理的属性非常独特,因此这对我来说很好用,无需检查整个属性路径。
如@Rao 所述,您的问题是 xpath 无法正确处理命名空间。使用“:”的语法对我来说并不是一直有效。正如本网站上显示的许多其他 XmlTask 答案一样,您需要改用 //*[local-name()='persistence']
语法。
此外,可以使用 @name
语法引用属性。
最后,如果要替换一个属性的值,不要用<replace xpath="...
,用<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>
在 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>
我需要处理的属性非常独特,因此这对我来说很好用,无需检查整个属性路径。
如@Rao 所述,您的问题是 xpath 无法正确处理命名空间。使用“:”的语法对我来说并不是一直有效。正如本网站上显示的许多其他 XmlTask 答案一样,您需要改用 //*[local-name()='persistence']
语法。
此外,可以使用 @name
语法引用属性。
最后,如果要替换一个属性的值,不要用<replace xpath="...
,用<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>