Problema durante la lettura del file XML nel DataSet C#
Domanda
Mi è stato fornito un file .xml che dovevo leggere nel mio codice come DataSet (come sfondo, il file è stato creato creando un DataSet
in C# e chiamando dataSet.WriteXml(file, XmlWriteMode.IgnoreSchema)
, ma questo è stato fatto da qualcun altro).
Il file .xml aveva la forma seguente:
<?xml version="1.0" standalone="yes"?>
<NewDataSet>
<Foo>
<Bar>abcd</Bar>
<Foo>efg</Foo>
</Foo>
<Foo>
<Bar>hijk</Bar>
<Foo>lmn</Foo>
</Foo>
</NewDataSet>
Utilizzando C# e .NET 2.0, ho letto il file utilizzando il codice seguente:
DataSet ds = new DataSet();
ds.ReadXml(file);
Utilizzando un punto di interruzione, dopo questo line ds.Tables[0]
appariva così (usando trattini al posto dei caratteri di sottolineatura che non sono riuscito a formattare correttamente):
Bar Foo-Id Foo-Id-0
abcd 0 null
null 1 0
hijk 2 null
null 3 2
Ho trovato una soluzione alternativa (so che ce ne sono molti) e sono riuscito a leggere con successo il file .xml, ma quello che vorrei capire perché ds.ReadXml(file)
eseguito in questo modo, così potrò evitare il problema in futuro.Grazie.
Soluzione
Questo sembra essere corretto per il tuo nidificato Tag Foo:
<NewDataSet>
<Foo> <!-- Foo-Id: 0 -->
<Bar>abcd</Bar>
<Foo>efg</Foo> <!-- Foo-Id: 1, Parent-Id: 0 -->
</Foo>
<Foo> <!-- Foo-Id: 2 -->
<Bar>hijk</Bar>
<Foo>lmn</Foo> <!-- Foo-Id: 3, Parent-Id: 2 -->
</Foo>
</NewDataSet>
Quindi questo diventa correttamente 4 record nel risultato, con una chiave genitore-figlio di "Foo-Id-0"
Tentativo:
<NewDataSet>
<Rec> <!-- Rec-Id: 0 -->
<Bar>abcd</Bar>
<Foo>efg</Foo>
</Rec>
<Rec> <!-- Rec-Id: 1 -->
<Bar>hijk</Bar>
<Foo>lmn</Foo>
</Rec>
</NewDataSet>
Il che dovrebbe risultare in:
Bar Foo Rec-Id
abcd efg 0
hijk lmn 1
Altri suggerimenti
Queste sono le mie osservazioni piuttosto che una risposta completa:
La mia ipotesi (senza provare a riprodurla da solo) è che potrebbero accadere un paio di cose mentre DataSet tenta di "appiattire" una struttura gerarchica in una struttura di dati relazionale.
1) pensare ai dati dal punto di vista del database relazionale;non esiste un campo di chiave primaria ovvio per identificare ciascuno degli elementi Foo nella raccolta, quindi DataSet ha utilizzato automaticamente la posizione ordinale nel file come campo generato automaticamente chiamato Foo-Id.
2) In realtà ci sono due elementi chiamati "Foo", il che probabilmente spiega la generazione di uno strano nome per la colonna "Foo-Id-0" (ha generato automaticamente un nome univoco per la colonna - immagino che potresti pensare a questo come comportamento di tolleranza agli errori nel DataSet).