如何使用wix将多个元素添加到XML配置文件中?

前端之家收集整理的这篇文章主要介绍了如何使用wix将多个元素添加到XML配置文件中?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试使用Wix编辑 XML文件.我正在使用与Wix 3.7捆绑在一起的WixUtilExtension. xml文件是在Visual Studio 2010中为C#应用程序创建的设置文件.在这个文件中,我使用的元素用于在数组中存储多个字符串值.这是未更改的设置文件内容
<configuration>
    <applicationSettings>
        <AppName.Properties.Settings>
            <setting name="StringArray" serializeAs="Xml">
                <value>
                    <ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                        xmlns:xsd="http://www.w3.org/2001/XMLSchema">
                    </ArrayOfString>
                </value>
            </setting>
        </AppName.Properties.Settings>
    </applicationSettings>
</configuration>

我想添加< string> < ArrayOfString>的元素此文件中的元素.一种方法是使用< XmlConfig> wix / UtilExtension命名空间中的元素.我已将此元素添加到包含配置文件的组件,如下所示:

<Component Id="ProductComponent" Guid="$(var.ConfigGuid)">
    <File Source="SettingsFile.exe.config" KeyPath="yes" Id="FILE_config" />
    <util:XmlConfig
      Name="string"
      Value="My value"
      File="[INSTALLFOLDER]SettingsFile.exe.config"
      Id="String1"
      On="install"
      Action="create"
      Node="element"
      ElementPath="/configuration/applicationSettings/AppName.Properties.Settings/setting[\[]@name='StringArray'[\]]/value/ArrayOfString"
      Sequence="100"
      />
</Component>

这导致添加一个< string>元素到< ArrayOfString>元件.要添加另一个< string>要设置文件的元素,必须将另一个XmlConfig元素添加到< Component>具有不同Id属性和Sequence属性的更高值的安装项目的元素,如下所示:

<util:XmlConfig
    Name="string"
    Value="My second value"
    File="[INSTALLFOLDER]SettingsFile.exe.config"
    Id="String2"
    On="install"
    Action="create"
    Node="element"
    ElementPath="/configuration/applicationSettings/AppName.Properties.Settings/setting[\[]@name='StringArray'[\]]/value/ArrayOfString"
    Sequence="101"
/>

安装msi后,< ArrayOfString>设置文件中的元素如下所示:

<ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                            xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<string>My value</string><string>My second value</string></ArrayOfString>

我发现可以设置< XmlConfig>的Value属性.属性为这样的属性的值:

<Property Id="STRING1VALUE" Value="My value" />
<util:XmlConfig Value="[STRING1VALUE]" ... />

这很好.我希望用户能够动态地在安装过程中添加多个值,以便可变数量的< string>元素可以添加到设置文件中.
我的第一种方法是使用<?foreach?>声明如下:

<?define values="My value;My second value"?>
<?foreach value in $(var.values)?>
    <util:XmlConfig
        Name="string"
        Value="$(var.value)"
        File="[INSTALLFOLDER]SettingsFile.exe.config"
        Id="String$(var.value)"
        On="install"
        Action="create"
        Node="element"
        ElementPath="/configuration/applicationSettings/AppName.Properties.Settings/setting[\[]@name='StringArray'[\]]/value/ArrayOfString"
        Sequence="101"
    />
<?endforeach?>

这种方法存在一些问题:

> foreach语句使用预处理器变量,该变量不能设置为属性的值.
> Sequence属性的值保持不变.

我希望用户将字符串元素的值存储在一个Property中,该值用分号分隔值,然后在foreach语句中解析它们,如下所示:

<Property Id="VALUES" Value="My value;My second value" />
<?foreach value in [VALUES]?>
    <util:XmlConfig
        Name="string"
        Value="$(var.value)"
        File="[INSTALLFOLDER]SettingsFile.exe.config"
        Id="String$(var.value)"
        On="install"
        Action="create"
        Node="element"
        ElementPath="/configuration/applicationSettings/AppName.Properties.Settings/setting[\[]@name='StringArray'[\]]/value/ArrayOfString"
        Sequence="101"
    />
<?endforeach?>

这会引发以下错误

The util:XmlConfig/@Id attribute's value,'String[VALUES]',is not a legal identifier. 
Identifiers may contain ASCII characters A-Z,a-z,digits,underscores (_),or periods (.). 
Every identifier must begin with either a letter or an underscore.

有什么办法可以用XmlFile或XmlConfig元素创建可变数量的元素吗? CustomAction是解决这个问题的唯一方法吗?

作为BdN3504的补充……而不是整体
<util:XmlConfig
    Name="string"
    Value="Dummy"
    File="[INSTALLFOLDER]SettingsFile.exe.config"
    Id="DummyEntry"
    On="install"
    Action="create"
    Node="element"
    ElementPath="/configuration/applicationSettings/AppName.Properties.Settings/setting[\[]@name='StringArray'[\]]/value/ArrayOfString"
    Sequence="1" />
<util:XmlConfig
    On="install"
    Action="delete"
    Id="DeleteDummyEntry"
    Node="element"
    File="[INSTALLFOLDER]SettingsFile.exe.config"
    VerifyPath="/configuration/applicationSettings/AppName.Properties.Settings/setting[\[]@name='StringArray'[\]]/value/ArrayOfString/string"
    ElementPath="/configuration/applicationSettings/AppName.Properties.Settings/setting[\[]@name='StringArray'[\]]/value/ArrayOfString"
    Sequence="2" />

事情.我建议使用

<EnsureTable Id='XmlConfig' />

这可确保XmlConfig表包含在输出MSI中,即使它是空的.(我本来只是把它作为评论..但我显然没有声誉)

猜你在找的XML相关文章