Jak można dodać wiele elementów do pliku konfiguracyjnego XML za pomocą wix?

Próbuję edytować plik XML za pomocą Wix. Używam WixUtilExtension dołączonego do Wix 3.7. Plik xml to plik ustawień utworzony w Visual Studio 2010 dla aplikacji C #. W tym pliku używam elementu, który służy do przechowywania wielu wartości łańcuchowych w tablicy. To jest treść niezmienionego pliku ustawień:

<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<ArrayOfString> element w tym pliku. Jednym ze sposobów na to jest użycie<XmlConfig> element z przestrzeni nazw wix / UtilExtension. Dodałem ten element do komponentu, który przechowuje plik konfiguracyjny w następujący sposób:

<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 to dodanie jednego<string> element do<ArrayOfString> element. Aby dodać kolejny<string> element do pliku ustawień, inny element XmlConfig musi zostać dodany do<Component> element projektu instalacji z innym atrybutem Id i wyższą wartością dla atrybutu Sequence w ten sposób:

<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 msi, the<ArrayOfString> element w pliku ustawień wygląda tak:

<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>

Odkryłem, że możliwe jest ustawienie atrybutu Value na<XmlConfig> przypisz wartość takiej właściwości:

<Property Id="STRING1VALUE" Value="My value" />
<util:XmlConfig Value="[STRING1VALUE]" ... />

To jest dobre. Chciałbym, aby użytkownik mógł dynamicznie dodawać wiele wartości w procesie instalacji, dzięki czemu zmienna ilość może się zmieniać<string> elementy można dodać do pliku ustawień. Moim pierwszym podejściem było użycie<?foreach?> takie oświadczenie:

<?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?>

Jest kilka problemów z tym podejściem:

Instrukcja foreach używa zmiennej preprocesora, której nie można ustawić na wartość właściwości.Wartość atrybutu Sekwencja pozostaje taka sama.

Chciałbym, aby użytkownik przechowywał wartości elementów łańcucha we właściwości, która oddziela wartości średnikami, a następnie analizuje je w instrukcji foreach, takiej jak ta:

<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ący 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 jest jakiś sposób, w jaki mogę utworzyć zmienną ilość elementów z elementem XmlFile lub XmlConfig? Czy jedynym rozwiązaniem tego problemu jest CustomAction?

questionAnswers(3)

yourAnswerToTheQuestion