6

将一个元素嵌套在另一个元素中的目的和/或收获是什么(除了增加创建/删除属性的可读性)? 我所指的示例(我使用的是WiX 3.6):XmlConfigXmlConfig

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

1 回答 1

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元素添加属性或子元素,该元素也正在创建中

希望这现在更有意义。很抱歉最初给出的错误答案。

于 2012-12-14T11:51:01.103 回答