Как заменить значение поля XML с помощью Ant?

В сценарии Ant мне нужно заменить значение javax.persistence.jdbc.url свойство в следующем файле persistence.xml.

<?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-файлов отображается в консоли и одинаково. Это как если бы указанная выше инструкция замены никогда не выполнялась (или никогда не определяла свойство для обновления).

=== Следующий ответ от Патриса ===========================================

Кажется, это работает без определения схемы для тега постоянства:

<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>

Атрибуты, которые мне нужно обработать, очень уникальны, поэтому для меня это будет работать без необходимости изучать весь путь атрибутов.

1 ответ

Решение

Как уже упоминалось @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>  
Другие вопросы по тегам