Próbuję edytować plik XML za pomocą Wix. Używam WixUtilExtension w pakiecie z Wix 3.7. Plik xml jest plikiem ustawień utworzonym w Visual Studio 2010 dla aplikacji C#. W tym pliku używam elementu, który służy do przechowywania wielu wartości ciągu w tablicy. To jest zawartość pliku ustawień niezmienionym:W jaki sposób można dodać wiele elementów do pliku konfiguracyjnego XML za pomocą wix?
<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>
chcę dodać <string>
elementy do elementu <ArrayOfString>
w tym pliku. Jednym ze sposobów na to jest użycie elementu <XmlConfig>
z przestrzeni nazw wix/UtilExtension. Dodałem ten element do elementu, który posiada plik konfiguracyjny tak:
<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>
Powoduje dodanie jednego <string>
elementu do elementu <ArrayOfString>
. Aby dodać kolejny element <string>
do pliku ustawień, kolejnym elementem XmlConfig musi zostać dodany do elementu <Component>
projektu konfiguracji z innym atrybutem id i wyższej wartości dla sekwencji atrybut tak:
<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"
/>
Po instalacji z msi element w pliku ustawień <ArrayOfString>
wygląda następująco:
<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>
I okazało się, że jest możliwe, aby ustawić atrybut wartość atrybutu <XmlConfig>
na wartość nieruchomości tak:
<Property Id="STRING1VALUE" Value="My value" />
<util:XmlConfig Value="[STRING1VALUE]" ... />
To dobrze. Chciałbym, aby użytkownik mógł dynamicznie dodawać wiele wartości w procesie instalacji, aby zmienna ilość elementów <string>
mogła zostać dodana do pliku ustawień. Moje pierwsze podejście było użyć <?foreach?>
oświadczenie takiego:
<?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?>
Istnieje kilka problemów z tym podejściem:
- Oświadczenie foreach używa zmiennej preprocesora, które nie mogą być ustawione na wartości własność.
- Wartość atrybutu Sekwencja pozostaje taka sama.
Chciałbym użytkownikowi przechowywać wartości dla elementów strunowych w nieruchomości, która oddziela wartości średnikami, a następnie analizować je w foreach jak ten:
<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?>
zgłasza to następujące błąd:
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.
Czy istnieje sposób na utworzenie zmiennej ilości elementów za pomocą elementu XmlFile lub XmlConfig? Czy jedynym rozwiązaniem tego problemu jest CustomAction?