【发布时间】:2014-08-26 21:56:53
【问题描述】:
我正在尝试使用 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> 元素。一种方法是使用 wix/UtilExtension 命名空间中的 <XmlConfig> 元素。我已将此元素添加到包含如下配置文件的组件中:
<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>
这会导致向<ArrayOfString> 元素添加一个<string> 元素。要将另一个 <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 属性的值保持不变。
我希望用户将字符串元素的值存储在一个属性中,该属性用分号分隔值,然后在 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 吗?
【问题讨论】:
标签: wix app-config elements