XMLPoke в NANT - Как обновить все экземпляры найденного строки
Вопрос
Привет, я использую XPath в моем сценарии сборки NANT, чтобы изменить некоторые переменные конфигурации между развитием и моей другой средой.
Я взял синтаксис из этого примера:
Пример выглядит так:
<xmlpoke
file="config01/app.config"
xpath="/configuration/appSettings/add[@key='AppName']/@value"
value="TradeMonster">
</xmlpoke>
То, что я хотел бы, это что-то похожее на это искать мои соединительные строки и найти все случаи «localhost Sqlexpress» и просто изменить их на «localhost»
Это возможно?
Решение
ИГРАЯ С Quick'n Грязным сценарием здесь ....
Если вы уверены, что в каждом файле есть только один элемент ConnectionStringStringString, вы можете выполнить это с помощью комбинации xmlpeek
а также xmlpoke
. Отказ Изменение строки легче выполнена с некотором C #, поэтому используя задачу сценариев для выполнения поиска REGEX и заменить:
<script language="C#" prefix="custom" >
<code>
<![CDATA[
[Function("fix")]
public static string Fix(string input) {
return Regex.Replace(input, @"localhost\\\w+", "localhost");
}
]]>
</code>
</script>
<!-- Get the existing connection string -->
<xmlpeek
file="config01/app.config"
xpath="/configuration/connectionStrings/add[@contains(@connectionString,'localhost\')]/@connectionString"
property="connectionstring">
</xmlpeek>
<!-- Write back the modified connection string -->
<xmlpoke
file="config01/app.config"
xpath="/configuration/connectionStrings/add[@contains(@connectionString,'localhost\')]/@connectionString"
value="${custom::fix(connectionstring)}">
</xmlpoke>
Другие советы
XPath только выбирает узлы, он не может изменить узлы.
Один из способов выполнения необходимых изменений - выполнить преобразование XSLT на XML-документе.
Чтобы это произошло, вы должны предоставить документ XML и указать, какой из его текстовых узлов должен быть изменен.