Problème de lecture du fichier XML dans C# DataSet
Question
On m'a donné un fichier .xml que je devais lire dans mon code en tant que DataSet (en arrière-plan, le fichier a été créé en créant un DataSet
en C# et appelant dataSet.WriteXml(file, XmlWriteMode.IgnoreSchema)
, mais cela a été fait par quelqu'un d'autre).
Le fichier .xml avait la forme suivante :
<?xml version="1.0" standalone="yes"?>
<NewDataSet>
<Foo>
<Bar>abcd</Bar>
<Foo>efg</Foo>
</Foo>
<Foo>
<Bar>hijk</Bar>
<Foo>lmn</Foo>
</Foo>
</NewDataSet>
En utilisant C# et .NET 2.0, j'ai lu le fichier en utilisant le code ci-dessous :
DataSet ds = new DataSet();
ds.ReadXml(file);
En utilisant un point d'arrêt, après cela line ds.Tables[0]
Cela ressemblait à ceci (en utilisant des tirets à la place des traits de soulignement que je n'arrivais pas à formater correctement) :
Bar Foo-Id Foo-Id-0
abcd 0 null
null 1 0
hijk 2 null
null 3 2
J'ai trouvé une solution de contournement (je sais qu'il y en a beaucoup) et j'ai réussi à lire le fichier .xml, mais j'aimerais comprendre pourquoi ds.ReadXml(file)
effectué de cette manière, je pourrai donc éviter le problème à l'avenir.Merci.
La solution
Cela semble être correct pour votre imbriqué Balises foto :
<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>
Cela devient donc correctement 4 enregistrements dans votre résultat, avec une clé parent-enfant de "Foo-Id-0"
Essayer:
<NewDataSet>
<Rec> <!-- Rec-Id: 0 -->
<Bar>abcd</Bar>
<Foo>efg</Foo>
</Rec>
<Rec> <!-- Rec-Id: 1 -->
<Bar>hijk</Bar>
<Foo>lmn</Foo>
</Rec>
</NewDataSet>
Ce qui devrait donner lieu à :
Bar Foo Rec-Id
abcd efg 0
hijk lmn 1
Autres conseils
Voici mes observations plutôt qu'une réponse complète :
Je suppose (sans essayer de le reproduire moi-même) que plusieurs choses peuvent se produire lorsque le DataSet tente de « aplatir » une structure hiérarchique en une structure de données relationnelle.
1) réfléchir aux données du point de vue d’une base de données relationnelle ;il n'y a pas de champ de clé primaire évident pour identifier chacun des éléments Foo de la collection, le DataSet a donc automatiquement utilisé la position ordinale dans le fichier en tant que champ généré automatiquement appelé Foo-Id.
2) Il y a en fait deux éléments appelés "Foo", ce qui explique probablement la génération d'un nom étrange pour la colonne "Foo-Id-0" (il a généré automatiquement un nom unique pour la colonne - je suppose que vous pourriez penser à ceci comme un comportement tolérant aux pannes dans le DataSet).