¿Cómo se pueden agregar múltiples elementos a un archivo de configuración XML con wix?

Estoy tratando de editar un archivo XML con Wix. Estoy usando WixUtilExtension incluido con Wix 3.7. El archivo xml es un archivo de configuración creado en Visual Studio 2010 para una aplicación de C #. En este archivo, estoy usando un elemento que se usa para almacenar varios valores de cadena en una matriz. Este es el contenido del archivo de configuraciones inalteradas:

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

Quiero agregar<string> elementos para el<ArrayOfString> elemento en este archivo. Una forma de hacer esto es usando un<XmlConfig> elemento del espacio de nombres wix / UtilExtension. He añadido este elemento al componente que contiene el archivo de configuración de esta manera:

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

Esto resulta en la adición de uno<string> elemento a la<ArrayOfString> elemento. Para agregar otro<string> elemento al archivo de configuración, otro elemento XmlConfig se debe agregar al<Component> Elemento del proyecto de instalación con un atributo de Id diferente y un valor más alto para el atributo de Secuencia como este:

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

Después de la instalación del msi, el<ArrayOfString> El elemento en el archivo de configuración se ve así:

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

Descubrí que es posible establecer el atributo Valor de una<XmlConfig> atribuir al valor de una propiedad como esta:

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

Esto es bueno. Me gustaría que el usuario pueda agregar múltiples valores en el proceso de instalación dinámicamente para que una cantidad variable de<string> Se pueden agregar elementos al archivo de configuración. Mi primer enfoque fue utilizar un<?foreach?> declaración como esta:

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

Hay algunos problemas con este enfoque:

La instrucción foreach utiliza una variable de preprocesador que no se puede establecer en el valor de una propiedad.El valor del atributo Secuencia se mantiene igual.

Me gustaría que el usuario almacene los valores de los elementos de cadena en una propiedad que separa los valores por punto y coma y luego los analice en una declaración foreach como esta:

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

Esto arroja el siguiente error:

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.

¿Hay alguna manera de que pueda crear una cantidad variable de elementos con el XmlFile o el elemento XmlConfig? ¿Es la única solución a este problema una CustomAction?

Respuestas a la pregunta(3)

Su respuesta a la pregunta