0

疲れているのかもしれませんが、これが 1 つの結果しか返さない理由がわかりません。Programs の下に 3 つの 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 に 1 つしかないためです。そのため、ループforeachは 1 回だけループし、さらに修正します。

        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

multipleElement("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 に答える