WiX XmlConfig: цель вложения XmlConfig в XmlConfig

Какова цель и/или выгода (кроме повышения удобочитаемости для создания/удаления атрибутов) для вложения элемента XmlConfig в другой элемент XmlConfig?

Пример того, что я имею в виду (я использую WiX 3.6):

<util:XmlConfig ...>
    <util:XmlConfig ... />
</util:XmlConfig>

person bsara    schedule 13.12.2012    source источник


Ответы (1)


Короткий ответ: единственная цель опции иметь вложенные элементы <util:XmlConfig> — возможность добавлять/удалять атрибуты в/из вновь созданных элементов более читабельным способом. Итак, это в основном то, что вы предполагали.

Рассмотрим следующий исходный файл XML:

<?xml version="1.0" encoding="utf-8"?>
<cars>
  <car name="ford" type="minivan"/>
  <car name="toyota" type="sedan"/>
  <motos>
    <moto name="honda" model="shadow" type="cruiser" />
  </motos>
</cars>

Чтобы добавить к нему еще один <moto>, можно использовать следующий фрагмент WiX:

<util:XmlConfig Id="elem1" Action="create" ElementPath="cars/motos" File="$(var.XmlFilePath)" Node="element" On="install" Name="moto">
  <util:XmlConfig Id="elem11" ElementId="elem1" Name="name" Value="yamaha" File="$(var.XmlFilePath)" />
  <util:XmlConfig Id="elem12" ElementId="elem1" Name="type" Value="chopper" File="$(var.XmlFilePath)" />
</util:XmlConfig>

В результате XML-файл выглядит следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<cars>
  <car name="ford" type="minivan"/>
  <car name="toyota" type="sedan"/>
  <motos>
    <moto name="honda" model="shadow" type="cruiser" />
    <moto name="yamaha" type="chopper" />
  </motos>
</cars>

Здесь следует отметить пару вещей:

  • атрибут Action не может быть определен во внутренних элементах XmlConfig, и это логично - он такой же, как и у родительского элемента
  • атрибут Node также не может быть определен, потому что разрешены только атрибуты
  • странно то, что вам нужно каждый раз указывать атрибут File - здесь, похоже, проблема с дизайном
  • атрибут ElementId должен указывать на родительский элемент, к которому вы добавляете атрибуты, и это также странно, поскольку его также можно «угадать» из вложенного кода.

В любом случае, если вы хотите создать структуру поддерева XML, элементы, которые становятся вложенными элементами в результирующем XML, состоят из XmlConfig элементов, размещенных на одном уровне. Итак, следующий фрагмент:

<util:XmlConfig Id="elem1" Action="create" ElementPath="cars/motos" File="$(var.XmlFilePath)" Node="element" On="install" Name="moto" Sequence="1">
  <util:XmlConfig Id="elem11" ElementId="elem1" Name="name" Value="yamaha" File="$(var.XmlFilePath)" />
  <util:XmlConfig Id="elem12" ElementId="elem1" Name="type" Value="chopper" File="$(var.XmlFilePath)" />
</util:XmlConfig>
<util:XmlConfig Id="elem2" Action="create" ElementPath="cars/motos/moto[\[]@name='yamaha'[\]]" File="$(var.XmlFilePath)" Node="element" On="install" Name="extra" Sequence="2">
  <util:XmlConfig Id="elem21" ElementId="elem2" File="$(var.XmlFilePath)" Name="bags" Value="leather" />
</util:XmlConfig>

преобразует XML следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<cars>
  <car name="ford" type="minivan"/>
  <car name="toyota" type="sedan"/>
  <motos>
    <moto name="honda" model="shadow" type="cruiser"/>
    <moto name="yamaha" type="chopper">
      <extra bags="leather"/>
    </moto>
  </motos>
</cars>

Обратите внимание на следующее:

  • элементы XmlConfig размещаются на одном уровне, хотя они приводят к вложенным элементам в результирующем XML
  • атрибут Sequence важен, если вы добавляете атрибут или дочерний элемент к элементу, который также создается

Надеюсь, теперь это имеет больше смысла. Извините за неправильный ответ, данный изначально.

person Yan Sklyarenko    schedule 14.12.2012
comment
@ Брэндон, я должен признать, что мой ответ был неправильным. Обновляю прямо сейчас... - person Yan Sklyarenko; 15.12.2012
comment
Спасибо за изменение ответа. Знаете ли вы, как сделать запрос функции, чтобы создать такой элемент, как util:XmlElement и util:XmlAttr, чтобы мы могли добавлять дочерние элементы util:XmlConfig, которые являются элементами? Это также уменьшило бы количество дублированного текста в элементах ElementPath и VerifyPath, если бы все могло быть просто относительно родителя. - person bsara; 17.12.2012
comment
@Brandon, вы должны начать с wixtoolset.org — он подскажет вам, как подать сообщение об ошибке или запросить функцию. Вы также можете изучить пакет расширений/настраиваемых действий здесь: github.com/dblock/msiext . В крайнем случае у вас всегда есть возможность самостоятельно разработать необходимые функции и создать кастомную сборку WiX для собственных нужд, не отправляя патч и не дожидаясь его принятия. - person Yan Sklyarenko; 18.12.2012