我正在尝试使用 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>
我发现可以将属性的 Value 属性设置为<XmlConfig>
属性的值,如下所示:
<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 属性的值保持不变。
我希望用户将字符串元素的值存储在属性中,该属性用分号分隔值,然后在 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 吗?