2016-03-02 3 views
1

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

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

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

+0

Показать образец XML, что вы работаете, чтобы увидеть, если это происходит потому, что любых пространств имен. – Rao

+0

Ваш путь замещения, похоже, не является допустимым XPath, должен быть более чем похожим: '/persistence/persistence-unit/properties/property[[name='javax.persistence.jdbc.url ']/@ value' –

+0

@Rao Я перешел на простой xml, который теперь включен в мой вопрос. Я также изменил свойство и значение на простые строки, чтобы избежать возможных конфликтов со специальными символами (периоды, двоеточия). Я все еще не могу заменить значение. – user2984213

ответ

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

Запуск в: javax.xml.transform.TransformerException: Неизвестный nodetype: local-name – user2984213

+0

Так что без схемы это, похоже, работает нормально. Можем ли мы предоставить некоторые подстановочные знаки как часть имени тега, чтобы сделать совпадение? – user2984213

+0

Я принимаю этот ответ, потому что Патрис включил подстановочный пример в свой ответ и показал мне тег 'attr'. Сочетание обеих работ для меня, как обрисовано в нижней части моего вопроса. Благодарю. – user2984213

 Смежные вопросы

  • Нет связанных вопросов^_^