Короткий ответ: единственная цель опции иметь вложенные элементы <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