Xmlpoke in Nant-見つかった文字列のすべてのインスタンスを更新する方法
質問
こんにちは私は私のnantビルドスクリプトでxpathを使用して、開発と他の環境の間にいくつかの構成変数を変更します。
この例から構文を取得しました。
この例は次のようになります:
<xmlpoke
file="config01/app.config"
xpath="/configuration/appSettings/add[@key='AppName']/@value"
value="TradeMonster">
</xmlpoke>
私が望むのは、これに似たもので、接続文字列を検索し、「localhost sqlexpress」のすべてのインスタンスを見つけて、単に「localhost」に変更するだけです。
これは可能ですか?
解決
ここでQuick'n Dirty Scriptでいます。
各ファイルに接続ストリング要素が1つしかないと確信している場合は、の組み合わせでこれを達成できます xmlpeek
と xmlpoke
. 。文字列の変更は、いくつかのC#で簡単に実行されるため、スクリプトタスクを使用して正規表現検索を行い、置き換えます。
<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はノードのみを選択し、ノードを変更できません.
必要な変更を達成する1つの方法は、XMLドキュメントでXSLT変換を実行することです。
これを実現するには、XMLドキュメントを提供し、どのテキストノードを変更するかを正確に指定する必要があります。
所属していません StackOverflow