0

也许我累了,但我不明白为什么这只会返回一个结果。Programs 下有三个 Program 元素,但我只得到 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());
}
4

2 回答 2

2

这是因为Programs您的 Xml 中只有一个,所以循环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();
于 2013-03-28T03:56:43.707 回答
1

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();
于 2013-03-28T03:55:01.370 回答