选择仅返回一个元素

时间:2013-03-28 03:46:25

标签: c# linq linq-to-xml

也许我累了,但我不明白为什么这只会返回一个结果。程序下有三个程序元素,但我只得到Excel作为结果。我错过了什么,为什么?

XML:

<ServerRole>
  <ServerType>Windows</ServerType>
  <Programs>
    <Program>Excel</Program>
    <Program>Outlook</Program>
    <Program>Word</Program>
  </Programs>
</ServerRole>

代码段:

var proggies = xlServerRoles.Descendants("ServerRole")
    .Where(prg => prg.Element("ServerType").Value == "Windows");

foreach (var prog in proggies.Descendants("Programs").Select(p => new
{
    programName = p.Element("Program").Value
}))
{
    alInstalledPrograms.Add(prog.programName.ToString());
}

2 个答案:

答案 0 :(得分:2)

这是因为你的Xml中只有一个Programs,所以循环foreach只循环一次,以便更正确:

        foreach (var prog in proggies.Descendants("Program").Select(p => new
        {
            programName = p.Value
        }))
        {
            alInstalledPrograms.Add(prog.programName.ToString());
        }

您可以直接在循环而不是Program中获取后代Programs。为了缩短方法,您甚至不需要循环:

var alInstalledPrograms = xlServerRoles.Descendants("ServerRole")
            .Where(prg => prg.Element("ServerType").Value == "Windows")
            .Descendants("Program")
            .Select(p => p.Value)
            .ToList();

答案 1 :(得分:1)

你在{em>复数 Element("Program")的地方使用Elements,但你的循环不会让你在那里得到它。尝试更像

的东西
var installedPrograms = (from serverRole in xlServerRoles.Descendants("ServerRole")
                         where serverRole.Element("ServerType").Value == "Windows"
                         from program in serverRole.Element("Programs").Elements("Program")
                         select program.Value).ToList();