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.

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top