2010-03-24 3 views
2

je travaillais avec un certain XML où aucun licenciementÉvite Licenciements dans les documents XML

<person> 
    <eye> 
    <eye_info> 
     <eye_color> 
     blue 
     </eye_color> 
    </eye_info> 
    </eye> 
    <hair> 
    <hair_info> 
     <hair_color> 
     blue 
     </hair_color> 
    </hair_info> 
    </hair> 
</person> 

étaient Comme vous pouvez le voir, l'œil-couleur sous-étiquette fait référence à l'oeil dans son nom, donc il y avait pas besoin d'éviter les licenciements, je pouvais obtenir la couleur des yeux en une seule ligne après le chargement du XML dans un jeu de données:

dataset.ReadXml(path); 
value = dataset.Tables("eye_info").Rows(0)("eye_color"); 

Je ne sais que ce n'est pas la façon la plus intelligente de le faire, et cette situation, je vais avoir maintenant n'était pas imprévu.

Maintenant, disons que je dois lire de xml qui sont dans ce format:

<person> 
    <eye> 
    <info> 
     <color> 
     blue 
     </color> 
    </info> 
    </eye> 
    <hair> 
    <info> 
     <color> 
     blue 
     </color> 
    </info> 
    </hair> 
</person> 

Donc, si je tente de l'appeler comme ceci:

dataset.ReadXml(path); 
value = dataset.Tables("info").Rows(0)("color"); 

Il y aura une redondance, parce que Je pouvais seulement aller jusqu'à un niveau supérieur pour identifier un seul champ dans un XML avec ma méthode précédente, et le 'désambiguateur' est trois niveaux ci-dessus.

Existe-t-il un moyen pratique d'atteindre sans erreur un seul champ avec tous les champs ci-dessus (ou au moins quelques)?

- [EDIT] -

J'ai fait une autre question demandant comment je pourrais obtenir un certain nœud avec LINQ, check it out.

Répondre

4

Vous pouvez également utiliser LINQ pour XML (espace de noms System.Xml.Linq) et récupérer vos données quelque chose comme ça

string xml = @"<persons> 
<person> 
    <eye> 
    <info> 
     <color>blue</color> 
    </info> 
    </eye> 
    <hair> 
    <info> 
     <color>blonde</color> 
    </info> 
    </hair> 
</person> 
<person> 
    <eye> 
    <info> 
     <color>green</color> 
    </info> 
    </eye> 
    <hair> 
    <info> 
     <color>brown</color> 
    </info> 
    </hair> 
</person> 
</persons>"; 

XDocument document = XDocument.Parse(xml); 

var query = from person in document.Descendants("person") 
      select new 
      { 
       EyeColor = person.Element("eye").Element("info").Element("color").Value, 
       HairColor = person.Element("hair").Element("info").Element("color").Value 
      }; 

foreach (var person in query) 
    Console.WriteLine("{0}\t{1}", person.EyeColor, person.HairColor); 
+0

J'irais avec Linq au Xml, c'est assez naturel. –

+0

Merci, j'ai eu un problème en essayant de l'utiliser .. vérifier la mise à jour – Marcelo

2

Il existe toute une norme organisée autour de l'interrogation de données à partir d'un document XML. La norme s'appelle XPath et C# a une implémentation. Ce n'est pas la chose la plus facile à apprendre, mais c'est l'une des meilleures techniques pour extraire des données XML et cela vaut la peine d'apprendre.

Here est un exemple.

EDIT: Je vous recommande de comprendre LINQ to XML mais comme il est plus puissant mais si vous voulez toujours XPath alors votre question spécifique ressemblerait à quelque chose comme (je n'ai pas VS sur cet ordinateur donc je ne pouvais pas vérifier cela) ...

XPathDocument doc = new XPathDocument(new StringReader(xmlString)); 
XPathNavigator nav = doc.CreateNavigator(); 

// Compile a standard XPath expression 
XPathExpression expr = nav.Compile("/person/eye/eye_info/eye_color"); 
expr = nav.Compile("/catalog/cd/price"); 
XPathNodeIterator iterator = nav.Select(expr); 

// Iterate on the node set 
while (iterator.MoveNext()) 
{ 
    XPathNavigator nav2 = iterator.Current.Clone(); 
    Console.WriteLine(nav2.Value); 
} 
+0

Je vais essayer xpath out! pourriez-vous me montrer un exemple? vérifiez la mise à jour dans la question – Marcelo

+0

Pour une introduction générale à XPath, consultez http://www.w3schools.com/xpath/default.asp. Dans .Net XPath est disponible via les méthodes SelectNode et SelectNodes sur les objets XmlNode et leurs descendants (c'est-à-dire XmlDocument). – Martin

0

Rappelez-vous que la classe DataSet ne peut comprendre XML qui peut être traduit dans le formulaire d'une base de données relationnelle. En particulier, il ne gérera pas une seule "table" enfant qui a plusieurs "tables" parent. Avoir un élément «info» comme enfant à la fois de la personne, des cheveux et des yeux en est un exemple.

Questions connexes