我正在尝试使用 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>
attribute 为属性的值,如下所示:
<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 是解决此问题的唯一方法吗?