Подтвердить что ты не робот

Преобразование Web Config: Вставить, если не существует

Я хотел бы применить преобразование тогда и только тогда, когда совпадающий элемент не существует в целевом объекте. Попробуйте различные выражения xpath с помощью http://webconfigtransformationtester.apphb.com/, но пока не повезло.

например. если целевой 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, если он не существует), но, по-видимому, нет.

4b9b3361

Ответ 1

Используйте xdt:Transform="InsertIfMissing" с задачей XmlTransform в VS2012. Это не похоже, что Microsoft обновила свою документацию, чтобы отразить это.

Ответ 2

В моем случае xdt:Transform="InsertIfMissing" не работал без xdt:Locator="Match(name)"

Ответ 3

Попробуйте это альтернативное преобразование для 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:

Вставить - добавляет элемент, определенный в файле преобразования, как родственный элемент к выбранному элементу или элементам. Новый элемент добавлен в конце любой коллекции.

Итак, если node уже существует, мы добавим второй, а затем удалим этот node (2nd). В противном случае мы добавим новый уникальный node, но операция удаления завершится неудачно.

Примечание. Кажется, он не работает с преобразованием NuGet *. (un) install.xdt. InsertIfMissing тоже.

Ответ 4

Используйте xdt:Transform="Remove", а затем xdt:Transform="Insert". xdt:Transform="InsertIfMissing", предложенный в другом месте, не работал у меня, выглядит как его версия.

Ответ 5

Подтверждена работа в 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>

Файл .nuspec:

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