Gli elementi XML ripetuti includono l'indice

Quando Microsoft.Extensions.Configuration.Xml viene utilizzato per leggere un documento XML con elementi XML ripetuti senza un attributo Name, le voci Configuration create con questi elementi ripetuti hanno ora un indice aggiunto al percorso di configurazione.

Versione introdotta

.NET 6

Comportamento precedente

Si considerino i frammenti XML seguenti che mostrano elementi ripetuti senza un attributo Name distinto.

<settings>
  <Data ConnectionString="TestConnectionString" />
  <Data Provider="MySql" />
</settings>
<configuration>
    <Level1>
        <Level2 Key1="Value1" />
        <Level2 Key2="Value2" />
    </Level1>
</configuration>

Le configurazioni create da questi file XML sono:

Data:ConnectionString = TestConnectionString
Data:Provider = MySql

e

Level1:Level2:Key1 = Value1
Level1:Level2:Key2 = Value2

rispettivamente.

Nuovo comportamento

Le configurazioni create dai file XML nella sezione Comportamento precedente sono ora:

Data:0:ConnectionString = TestConnectionString
Data:1:Provider = MySql

e

Level1:Level2:0:Key1 = Value1
Level1:Level2:1:Key2 = Value2

rispettivamente.

Tipo di modifica che causa un'interruzione

Questa modifica può influire sulla compatibilità binaria.

Motivo della modifica

Questa modifica è stata introdotta per supportare completamente elementi XML ripetuti che non dispongono di un attributo Name. Il comportamento precedente è consentito solo per gli elementi ripetuti di impostare valori univoci (usando attributi o sottoelementi). Se gli elementi XML ripetuti hanno lo stesso attributo, è stata generata un'eccezione.

Per ottenere il comportamento originale, è possibile aggiornare il codice XML per comprimere i due attributi nello stesso elemento. Ad esempio:

<configuration>
    <Level1>
        <Level2 Key1="Value1" Key2="Value2" />
    </Level1>
</configuration>

In alternativa, è possibile aggiornare il codice in modo da prevedere indici (ad esempio 0, 1, 2) nelle chiavi IConfiguration:

configRoot.GetSection("Level1:Level2")

diventa

configRoot.GetSection("Level1:Level2:0")

API interessate

Vedi anche