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.

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top