微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用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中,即使它是空的.(我本来只是把它作为评论..但我显然没有声誉)

原文地址:https://www.jb51.cc/xml/292092.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。