Problem beim Lesen der XML-Datei in C# DataSet
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.
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).