WiX XmlConfig:用于在XmlConfig中嵌套XmlConfig

时间:2012-12-13 22:25:59

标签: xml wix wix3.6 wix-extension

XmlConfig元素嵌套在另一个XmlConfig元素中的目的和/或收益(创建/删除属性的可读性增加除外)是什么?

我所指的例子(我正在使用 WiX 3.6 ):

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

1 个答案:

答案 0 :(得分:17)

简短回答:具有嵌套<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属性非常重要,以防您在元素中添加属性或子元素(也正在创建)

希望现在更有意义。对不起,最初给出了错误的答案。