LINQ to XML Вопрос новичка: возвращение узлов по имени узла - PullRequest
0 голосов
/ 27 ноября 2008

Привет!

Если у меня есть 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>

Я бы хотел получить все элементы выбора в «BetaSection», независимо от «набора», к которому они относятся. Я пробовал следующее:

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
                 };

Но безрезультатно. Как бы я пошел по этому поводу?

Спасибо.

Ответы [ 2 ]

6 голосов
/ 27 ноября 2008

Вы вообще не нуждаетесь в предложении where - вам просто нужно изменить вызов Elements на Descendants:

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

(я преобразовал его из выражения запроса в простую точечную нотацию, поскольку я не думаю, что выражение запроса действительно помогло вам.)

0 голосов
/ 28 ноября 2008

Я бы написал это вместо этого. Я предпочитаю синтаксис SQL вместо синтаксиса метода, но дело вкуса ...

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