2013-03-28 176 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