Frage

Ich erhielt eine .xml-Datei, die ich als DataSet in meinen Code einlesen musste (als Hintergrund wurde die Datei durch Erstellen einer erstellt DataSet in C# und Aufruf dataSet.WriteXml(file, XmlWriteMode.IgnoreSchema), aber das wurde von jemand anderem gemacht).

Die XML-Datei hatte das folgende Format:

 <?xml version="1.0" standalone="yes"?>
 <NewDataSet>
  <Foo>
    <Bar>abcd</Bar>
    <Foo>efg</Foo>
  </Foo>
  <Foo>
    <Bar>hijk</Bar>
    <Foo>lmn</Foo>
  </Foo>
</NewDataSet>

Mit C# und .NET 2.0 lese ich die Datei mit dem folgenden Code ein:

        DataSet ds = new DataSet();
        ds.ReadXml(file);

Anschließend einen Haltepunkt verwenden line ds.Tables[0] sah so aus (mit Bindestrichen anstelle von Unterstrichen, die ich nicht richtig formatieren konnte):

Bar     Foo-Id    Foo-Id-0
abcd     0         null
null     1         0
hijk     2         null
null     3         2

Ich habe eine Problemumgehung gefunden (ich weiß, dass es viele gibt) und konnte die XML-Datei erfolgreich einlesen, aber ich würde gerne verstehen, warum ds.ReadXml(file) auf diese Weise durchgeführt, sodass ich das Problem in Zukunft vermeiden kann.Danke.

War es hilfreich?

Lösung

Dies scheint für Sie richtig zu sein verschachtelt Foo-Tags:

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

Dies ergibt also korrekterweise 4 Datensätze in Ihrem Ergebnis, mit einem übergeordneten/untergeordneten Schlüssel von „Foo-Id-0“.

Versuchen:

<NewDataSet>  
  <Rec>              <!-- Rec-Id: 0 -->
    <Bar>abcd</Bar>
    <Foo>efg</Foo>   
  </Rec>
  <Rec>              <!-- Rec-Id: 1 -->
    <Bar>hijk</Bar>
    <Foo>lmn</Foo>   
  </Rec>
</NewDataSet>

Was ergeben sollte:

Bar     Foo        Rec-Id
abcd    efg        0
hijk    lmn        1

Andere Tipps

Dies sind meine Beobachtungen und keine vollständige Antwort:

Meine Vermutung (ohne zu versuchen, es selbst zu reproduzieren) ist, dass einige Dinge passieren könnten, wenn das DataSet versucht, eine hierarchische Struktur zu einer relationalen Datenstruktur „abzuflachen“.

1) Betrachtung der Daten aus der Perspektive einer relationalen Datenbank;Es gibt kein offensichtliches Primärschlüsselfeld zur Identifizierung der einzelnen Foo-Elemente in der Sammlung, daher hat das DataSet automatisch die Ordnungsposition in der Datei als automatisch generiertes Feld namens Foo-Id verwendet.

2) Es gibt tatsächlich zwei Elemente namens „Foo“, was wahrscheinlich die Generierung eines seltsamen Namens für die Spalte „Foo-Id-0“ erklärt (es wurde automatisch ein eindeutiger Name für die Spalte generiert – das fällt Ihnen wohl ein dies als fehlertolerantes Verhalten im DataSet).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top