2013-03-28 140 views
0

也许我很累,但我没有看到为什么这只返回一个结果。程序下有三个程序元素,但我只得到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

这是因为只有一个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(); 
+0

感谢您的示例和说明。 – Sparhawk 2013-03-28 04:21:46

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(); 
+0

谢谢,这两个解释之间,真的帮了很多。 – Sparhawk 2013-03-28 04:22:18

相关问题