Wix で XML ファイルを編集しようとしています。Wix 3.7 にバンドルされている WixUtilExtension を使用しています。xml ファイルは、C# アプリケーション用に Visual Studio 2010 で作成された設定ファイルです。このファイルでは、複数の文字列値を配列に格納するために使用される要素を使用しています。これは、変更されていない設定ファイルの内容です。
<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>
これを行う 1 つの方法は<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>
要素に 1 つの要素が追加され<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 属性の値は変わりません。
ユーザーに、値をセミコロンで区切るプロパティに文字列要素の値を格納してから、次のような 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 ですか?