我正在尝试使用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' />