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

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

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

最佳答案

简短的答案:仅使用才有嵌套<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属性很重要,以防您向元素中添加属性或子元素,该元素或元素也会被创建

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

    关于xml - WiX XmlConfig : Purpose for nesting XmlConfig in XmlConfig,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13869589/

    10-13 07:57