Привет!
Если у меня есть такой 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>
Я хотел бы получить все элементы Choice в «BetaSection», независимо от «Set», к которому они принадлежат. Я пробовал следующее:
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
};
Но безрезультатно. Как мне это сделать?
Спасибо.





Вам вообще не нужно предложение where - вам просто нужно изменить вызов Elements на Descendants:
var choiceList = myXDoc.Root
.Element("BetaSection")
.Descendants("Choice")
.Select(element => new
{
Name = element.Attribute("id").Value,
Data = element.Value;
});
(Я преобразовал его из выражения запроса в простую точечную нотацию, поскольку не думаю, что выражение запроса действительно вам помогло.)
Ага, это .Descendants ("Выбор"). Спасибо обоим :)
Я бы написал это вместо этого. Я предпочитаю синтаксис 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 );
}
}
}
Разве это не должно быть .Descendants ("Выбор")