2008-09-09 7 views
6

J'ai reçu un fichier .xml que j'avais besoin de 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 en appelant dataSet.WriteXml(file, XmlWriteMode.IgnoreSchema), mais cela a été fait par quelqu'un d'autre).Problème de lecture du fichier XML dans C# DataSet

Le fichier .xml a été formé comme ceci:

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

utilisant C# et .NET 2.0, j'ai lu le fichier en utilisant le code ci-dessous:

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

L'utilisation d'un point d'arrêt, après line ds.Tables[0] ressemblait à ceci (en utilisant des tirets à la place de underscores que je ne pouvais 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 pu lire avec succès dans le fichier .xml, mais j'aimerais savoir pourquoi ds.ReadXml(file) effectué de cette manière, donc je serai en mesure d'éviter le problème dans le avenir. Merci.

Répondre

4

Cela semble être correct pour vos imbriqués balises 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> 

Donc, cela devient correctement 4 enregistrements dans votre résultat, avec une clé parent-enfant de "Foo-Id-0"

Essayez:

<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 se traduire par:

Bar  Foo  Rec-Id 
abcd efg  0 
hijk lmn  1 
0

Ce sont mes observations plutôt qu'une réponse complète:

Je pense (sans essayer de re-produire moi-même) est qu'un certain nombre de choses peut se produire que le DataSet tente de « aplatir » une structure hiérarchique à une structure de données relationnelle.

1) de penser aux données du point de vue de la base de données relationnelle; il n'y a pas de champ de clé primaire évident pour identifier chacun des éléments Foo dans la collection de sorte que le DataSet a automatiquement utilisé la position ordinale dans le fichier comme un 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 vous pourriez considérer cela comme un comportement tolérant aux pannes dans le DataSet).