web-dev-qa-db-ja.com

Web構成変換:存在しない場合は挿入

ターゲットに一致する要素が存在しない場合にのみ、変換を適用したいと思います。 http://webconfigtransformationtester.apphb.com/ を使用してさまざまなxpath式を試しますが、これまでのところ運はありません。

例えば。ターゲットweb.configが次のような場合:

_<configuration>
  <system.web>
    <compilation debug="true" />
  </system.web>
</configuration>
_

出力は次のようになります。

_<configuration>
  <connectionStrings>
    <add name="MyCs" provider="System.Data.SqlClient" connectionString="" />
    <add name="SomeOtherCs" provider="System.Data.SqlClient" connectionString="" />
  </connectionStrings>
  <system.web>
    <compilation debug="true" />
  </system.web>
</configuration>
_

しかし、ターゲットが次のように見える場合:

_<configuration>
  <connectionStrings>
    <add name="MyCs" provider="System.Data.IChangedIt" connectionString="my connection string here" />
  </connectionStrings>
  <system.web>
    <compilation debug="true" />
  </system.web>
</configuration>
_

変換の結果は次のようになります。

_<configuration>
  <connectionStrings>
    <add name="MyCs" provider="System.Data.IChangedIt" connectionString="my connection string here" />
    <add name="SomeOtherCs" provider="System.Data.SqlClient" connectionString="" />   
  </connectionStrings>
  <system.web>
    <compilation debug="true" />
  </system.web>
</configuration>
_

言い換えれば、名前付き接続文字列を構成に追加するだけで、管理者が自分の値を入力できるようにします。 xdt:Transform="Insert" xdt:Locator="XPath(count(/configuration/connectionStrings)=0)"(存在しない場合にcs configセクションを追加する)と同じくらい簡単だと思いましたが、明らかにそうではありません。

44
João Bragança

使用する xdt:Transform="InsertIfMissing" VS2012のXmlTransformタスク。これを反映するためにMicrosoftがドキュメントを更新したようには見えません。

55
ADW334034

私の場合、xdt:Locator="Match(name)"なしでは_xdt:Transform="InsertIfMissing"_は機能しませんでした

34
GerardBeckerleg

xdt:Transform = "InsertIfMissing"のこの代替変換を試してください。

<?xml version="1.0"?>
<configuration xmlns:xdt="http://schemas.Microsoft.com/XML-Document-Transform">
  <nodeToInsertIfMissing xdt:Transform="Insert" />
  <nodeToInsertIfMissing xdt:Transform="Remove" xdt:Locator="XPath(/configuration/nodeToInsertIfMissing[2])" />
</configuration>

MSDNドキュメント に従って動作するはずです。

Insert-変換ファイルで定義されている要素を選択された要素の兄弟。新しい要素は、コレクションの最後に追加されます

そのため、ノードが既に存在する場合、2番目のノードを追加してから、このノードを削除します(2番目)。そうでない場合、新しい一意のノードを追加しますが、削除操作は失敗します。

注:NuGet*。(un)install.xdt変換では機能していないようです。 InsertIfMissingも。

11
Kryszal

VS2015およびパッケージマネージャーコンソールホストバージョン3.4.4.1321での動作を確認しました(パッケージマネージャーコンソールを開くと、これを見つけることができます)。

「configuration\connectionStrings\add\@name」が存在しない場合に挿入されます。

App.config.install.xdt:

<?xml version="1.0" encoding="utf-8" ?>
<configuration xmlns:xdt="http://schemas.Microsoft.com/XML-Document-Transform">
    <connectionStrings xdt:Transform="InsertIfMissing">
        <add name="MyCs" provider="System.Data.SqlClient" connectionString="" xdt:Transform="InsertIfMissing" xdt:Locator="Match(name)"/>
    </connectionStrings>
</configuration>

.nu​​specファイル:

<files>
    <file src="app.config.install.xdt" target="content\app.config.install.xdt" />
5
OzBob

使用する xdt:Transform="Remove" に続く xdt:Transform="Insert"変換します。 xdt:Transform="InsertIfMissing"他の場所では機能しないと示唆されたが、バージョン固有のようだ。

4
Taras Alenin