2010-11-20 22 views
1

Ainsi, la question noobie du jour ...LINQ to XML: attributs de retour des enfants du même nom et les parents du même nom

J'ai un fichier XML avec la structure suivante:

<result> 
    <rowSet name="name"> 
    <row name="name1" /> 
    <row name="name2" /> 
    <row name="name3" /> 
    </rowSet> 
    <rowSet name="type"> 
    <row type="type1" /> 
    <row type="type2" /> 
    <row type="type3" /> 
    </rowSet> 

etc.. 

</result> 

J'ai essayé, et plutôt sans succès, d'obtenir les attributs de ligne à partir d'un seul rowSet basé sur le nom rowSet: attribute. En d'autres termes, j'essaie de tirer les attributs de la "rangée" qui est seulement contenue sous un rowSet: Attribut d'un nom spécifique.

J'ai essayé d'utiliser:

var rowSet = from rs in xmlDoc.Descendants("result") 
       where rs.Descendants("rowset").Attributes("name").Any(a => a.Value == "name") 
       select new 
       { 
        row = from r in xmlDoc.Descendants("row") 
          select new 
          { 
           skillID = r.Attribute("name"), 
          } 
       }; 

Cependant, cela ne donne pas plus d'un seul résultat. Été plutôt frustrant, et encore une fois ... après avoir essayé 15 suggestions différentes, j'ai été incapable de me souvenir du code original pour le lecteur.

Une réponse a été donnée:

var rowNames = (from i in xmlDoc.Descendants("rowSet") 
       where (string)i.Attribute("name") == "name" 
       select i.Descendants("row")) // Had to move this last) to... 
       .Select(r => (string)r.Attribute("name")); // Here in order to get it to work 

je crois que cela a fonctionné, mais je suis trop noobish pour savoir comment itérer à travers elle, même si je peux accéder aux données via le « Résultat View » de le débogueur lorsque le programme est en cours d'exécution.


Ok, donc je suis en mesure d'obtenir cette requête à courir à droite (en déplaçant un «) » en premier) et quand je commence par le code pas à pas, les rownames a des valeurs en elle. Cependant, je n'ai pas réussi à afficher l'information de quelque façon que ce soit. Je joue avec cela dans une application de console, fyi.

Alors c'est le premier problème.

Le second est, si je commence à faire mon XML un peu plus compliqué, en ajoutant plusieurs attributs aux éléments de la ligne, comme:

<result> 
    <rowSet name="name"> 
     <row fName="Ted" lName = "Happy" /> 
     <row name="Billy" lName = "Maddison"/> 
     <row name="John" lName = "Doe"/> 
    </rowSet> 
    <rowSet name="type"> 
     <row type="type1" type2 ="Hero"/> 
     <row type="type2" type2 ="Villain" /> 
     <row type="type3" type2 ="Neutral"/> 
    </rowSet> 
</result> 

Comment puis-je récupérer tous les attributs dans un élément?

Cela semble si basique, c'est pourquoi je me sens assez retardé pour le moment.

+0

Pouvez-vous clarifier la sortie désirée? –

+0

Je cherche simplement à retourner les attributs des différentes "rangées". – Josh

Répondre

0

Vous pouvez obtenir les noms seuls assez facilement:

var rowNames = from i in xmlDoc.Descendants("rowSet") 
       where (string)i.Attribute("name") == "name" 
       from r in i.Descendants("row") 
       select (string)r.Attribute("name"); 

Il suffit de régler les chaînes pour obtenir l'autre. (Vous pouvez lancer ceci dans une méthode et utiliser des paramètres, par exemple.)

+0

Voir OP, merci pour la saisie. – Josh

+0

Si vous déplacez le paren, la requête se comportera très différemment. S'il vous plaît essayez exactement ma réponse, et itérer à travers elle comme ceci: 'foreach (chaîne str dans rowNames) Console.WriteLine (str);' - vous devriez voir tous les attributs que vous voulez à partir du premier rowSet. – cdhowie

+0

Je reçois une erreur: Erreur 'System.Collections.Generic.IEnumerable ' ne contient pas de définition pour 'Attribute' et aucune méthode d'extension 'Attribute' acceptant un premier argument de type 'System.Collections.Generic.IEnumerable ' – Josh

-1

C'est un peu de devinettes, mais voulez-vous dire:

from rs in xmlDoc.Descendants("result").Descendants("rowSet") 
where (string)rs.Attribute("name") == "name" 
from r in rs.Descendants("row") 
select new { skillID = (string)r.Attribute("type") }