0

ネストされたLINQtoXMLクエリに関する質問:

コード:

List<string> GetNames(string fooName)
{
  string fileName = "foo.xml";

  XElement myFile = XElement.Load(fileName);
  IEnumerable<XElement> bars =
     from response in myFile.Elements("foo")
     where response.Attribute("fooName").Value.Equals(fooName)
     from subResponse in response.Descendants()
     select subResponse;

  List<string> sNames = new List<string>();

  foreach (XElement el in bars)
  {
     XAttribute NameAttr = el.Attribute("Name");
     sNames.Add(NameAttr.Value);
  }
  return sNames;
}

xml:

<topElem>
  <foo fooname="a">
     <bar Name= "bb"/>
     <bar Name= "cc"/>
     <bar Name= "dd"/>
  </foo>
</topElem>

質問:

私がやろうとしているのは、引数「a」を指定して上記の関数を呼び出したときに、「bb」、「cc」、および「dd」を含むリストを作成することです。上記のコードは機能しますが、LINQに精通していれば、リストをLINQコードで直接作成でき、foreachループに依存してIEnumerableを反復処理する必要はないと思います。私はこのサイトや他の人たちがこの正確なケースを見つけようとしている多くの例を見てきましたが、あまり運がありませんでした。ラムダ式を使用したり、「select」ステートメントで他の操作を実行したりする例をいくつか見てきましたが、それをコンパイルするコードを取得することはできませんでした。たぶん、ステートメントから3番目を追加します。

from subSubResponse in subResponse.Attribute("Name")
select subResponse.Value

しかし、それはエラーになります:

タイプ'System.Xml.Linq.XAttribute'の式は、ソースタイプ'System.Collections.Generic.IEnumerable'のクエリ式の後続のfrom句では許可されていません。'SelectMany'の呼び出しで型推論が失敗しました。

4

1 に答える 1

0

fromコレクションを返す式でのみ使用できます。
.Attribute("Name")コレクションを返さないため、その行は意味がありません。

あなたが望むかもしれません

let subSubResponse = subResponse.Attribute("Name")

あるいは単に

select subResponse.Attribute("Name").Value
于 2013-01-22T16:57:45.743 に答える