2008-11-27 7 views
0

Salutations!LINQ to XML Débutant Question: Renvoyer des noeuds par nom de noeud

Si je XML, comme ceci:

<Root> 
    <AlphaSection> 
    . 
    . 
    . 
    </AlphaSection> 

    <BetaSection> 
     <Choices> 
      <SetA> 
       <Choice id="choice1">Choice One</Choice> 
       <Choice id="choice2">Choice Two</Choice> 
      </SetA> 
      <SetB> 
       <Choice id="choice3">Choice Three</Choice> 
       <Choice id="choice4">Choice Four</Choice> 
      </SetB> 
     </Choices> 
    </BetaSection> 

    <GammaSection> 
    . 
    . 
    . 
    </GammaSection> 
</Root> 

Je voudrais obtenir tous les articles choix dans la « BetaSection », quelle que soit la « Set » qu'ils appartiennent. J'ai essayé ce qui suit:

var choiceList = from choices in myXDoc.Root.Element("BetaSection").Elements("Choices") 
       where (choices.Name == "Choice") 
       select new 
       { 
        Name = choices.Attribute("id").Value, 
        Data = choice.Value 
       }; 

Mais en vain. Comment pourrais-je m'y prendre?

Merci.

Répondre

6

Vous n'avez pas besoin de la clause where du tout - il vous suffit de changer les éléments appelés à l'Descendants:

var choiceList = myXDoc.Root 
         .Element("BetaSection") 
         .Descendants("Choice") 
         .Select(element => new 
           { 
            Name = element.Attribute("id").Value, 
            Data = element.Value; 
           }); 

(je l'ai converti d'une expression de requête à la notation simple point que je Je ne pense pas que l'expression de la requête vous a vraiment aidé.)

+0

devrait-il pas être .Descendants (« Choice ») –

+0

Eh oui, il est .Descendants (« choix »). Merci à tous les deux :) – Bullines

+0

Oups, oui. Fixé. –

0

Je l'écrirais à la place. Je préfère la syntaxe SQL au lieu de la syntaxe de méthode, mais est une question de goût ...

class Program 
{ 
    static void Main(string[] args) 
    { 
     String  xml   = @"<Root> 
             <AlphaSection></AlphaSection> 
             <BetaSection> 
              <Choices> 
               <SetA> 
                <Choice id='choice1'>Choice One</Choice> 
                <Choice id='choice2'>Choice Two</Choice> 
               </SetA> 
               <SetB> 
                <Choice id='choice3'>Choice Three</Choice> 
                <Choice id='choice4'>Choice Four</Choice> 
               </SetB> 
              </Choices> 
             </BetaSection> 
             <GammaSection></GammaSection> 
            </Root>"; 
     XElement xmlElement = XElement.Parse(xml); 
     var   choiceList = from c in xmlElement.Descendants().Elements("Choice") 
            select new { 
             Name = c.Attribute("id").Value, 
             Data = c.Value 
            }; 
     foreach (var choice in choiceList) { 
      Console.WriteLine("Name: {0} Data: {1}", choice.Name, choice.Data); 
     } 
    } 
}