2010-11-22 6 views
2

J'ai un fichier xml formaté comme ceci:C#: Comment DataSet.readXML ("filepath") fonctionne avec mon fichier XML contenant des objets dans des objets dans des objets?

<items> 
<item> 
    <itemProperty1>Propeterty1</itemProperty1> 
    <itemProperty2>Propeterty2</itemProperty2> 
    <propertyWithSubProperties1> 
     <subprop1>subProp1</subProp1> 
     <subprop2>subProp2</subProp2> 
     <deeperPropertyWithSubProperties1> 
      <deeperSubProperty1>data</deeperSubProperty1> 
      <deeperSubProperty2>data2</deeperSubProperty2> 
     </deeperPropertyWithSubProperties1> 
    </propertyWithSubProperties1> 
</item> 
...More items 
</items> 

J'essaie d'utiliser un ensemble de données en C# pour lire dans ce fichier de données comme ceci:

DataSet dataSet = new DataSet(); 
dataSet.ReadXml(fileName); 

je peux accéder à la première deux éléments sans problème comme celui-ci:

firstProperty = dataSet.Tables[0].Rows[i][0].ToString(); 
secondProperty = dataSet.Tables[0].Rows[i][1].ToString(); 

Mais rien que je suis complètement dérouté quant à la façon d'obtenir l'information dans les autres éléments parce qu'ils sont un niveau ou plus Plus profond. Mes recherches Google habituelles ne servent à rien.

Répondre

3

Votre DataSet contiendra trois tableaux:

  • dataSet.Tables[0]:
    Colonnes itemProperty1, itemProperty2 et item_Id.

  • dataSet.Tables[1]:
    Colonnes subProp1, subProp2, propertyWithSubProperties1_Id et item_Id.

  • dataSet.Tables[2]:
    Colonnes deeperSubProperty1, deepSubProperty2 et propertyWithSubProperties1_Id.

Tables[0] est lié à Tables[1] en utilisant les colonnes générées automatiquement item_Id.

Tables[1] est liée à Tables[2] en utilisant les colonnes propertyWithSubProperties1_Id générées automatiquement.

+0

Merci pour l'explication. – Carthage

1

Un DataSet n'est probablement pas la structure de données idéale pour cette hiérarchie imbriquée. Avez-vous envisagé de lire le XML directement? Cela peut se faire comme suit:

XmlDocument d = new XmlDocument(); 
d.Load("XmlFile1.xml"); 

XmlElement items = d.DocumentElement;//(XmlElement)d.GetElementById("items"); 
XmlElement item = (XmlElement)items.ChildNodes[0]; 
XmlElement itemProperty1 = item["itemProperty1"]; 
XmlElement itemProperty2 = item["itemProperty2"]; 
XmlElement propertyWithSubProperties1 = item["propertyWithSubProperties1"]; 
XmlElement subProp1 = propertyWithSubProperties1["subprop1"]; 
XmlElement subProp2 = propertyWithSubProperties1["subprop2"]; 
XmlElement deeperPropertyWithSubProperties1 = propertyWithSubProperties1["deeperPropertyWithSubProperties1"]; 
XmlElement deeperSubProperty1 = deeperPropertyWithSubProperties1["deeperSubProperty1"]; 
XmlElement deeperSubProperty2 = deeperPropertyWithSubProperties1["deeperSubProperty2"]; 

Console.WriteLine(itemProperty1.InnerText); 
Console.WriteLine(itemProperty2.InnerText); 
Console.WriteLine(subProp1.InnerText); 
Console.WriteLine(subProp2.InnerText); 
Console.WriteLine(deeperSubProperty1.InnerText); 
Console.WriteLine(deeperSubProperty2.InnerText); 
Console.ReadKey(); 

Ce n'est pas la « meilleure » façon de traiter les documents XML, mais il est probablement plus analogue à l'approche DataSet que vous essayez. D'autres options sont d'utiliser XmlTextReader ou LINQ to XML (comme suggéré par @TomS).

+0

Merci pour cela, il semble beaucoup plus simple. – Carthage

+0

Si vous avez trouvé la réponse utile, vous devriez probablement voter pour :) –

Questions connexes