2012-01-07 5 views
1

私は複雑なXMLファイルを持っており、さまざまなレベルで、次の部分が存在することがあります。このlinqクエリが最初の属性のみを返すのはなぜですか?

<ChrNote> 
    <note>The appropriate character is:</note> 
</ChrNote> 
<ChrDef> 
    <extension char="A">initial</extension> 
    <extension char="D">subsequent</extension> 
    <extension char="G">subsequent delayed</extension> 
    <extension char="S">sequel </extension> 
</ChrDef> 
... 

を、ここで私は、テキストファイルの構築に使用するコードスニペットです:

var lv1s = from lv1 in XMLDoc.Descendants("chapter").DescendantsAndSelf() 
      select new 
      { 
       SChar = (string)lv1.Element("ChrNote") ?? "", 
       SCharDef = (string)lv1.Element("ChrDef") ?? "", 
       //Returns only first attribute ..? 
       CharLetter = (lv1.Element("ChrDef") == null ? "" : 
          (string)(lv1.Element("ChrDef") 
             .Element("extension") 
             .Attribute("char")) ?? "") 
      }; 

問題が上記のクエリは、要素 "extension"から最初の属性( "A")のみを返します。です。私はlinqの経験はありませんし、どんな助けも高く評価されます。

答えて

0

は、あなたが探しているものを、このですか?

The appropriate character is: 
initial, A 
subsequent, D 
subsequent delayed, G 
sequel , S 
+0

はい、完璧に動作します!ありがとう... – Nikolas

+0

偉大な、私の喜び:)答えとしてマークしてください。 – trydis

4

(私はあなたの質問は、「リターンにのみ最初の属性を」言うことを知っているが、1つの属性のみがそこにある - ので、私が代わりにあなたの暗黙の質問に答えるよ。)それは唯一の最初の拡張要素を返します

Element("extension")を使用しているためです代わりにElements("extension")を使用した場合は、他のものを取得します。

のドキュメントを参照してください:

http://msdn.microsoft.com/en-us/library/system.xml.linq.xcontainer.element.aspx
http://msdn.microsoft.com/en-us/library/bb348975.aspx

+0

私はすでに成功を収め、このアプローチせずに試してみる:

var result = from x in XMLDoc.Descendants("chapter") let Definitions = x.XPathSelectElements("ChrDef/extension") select new { Note = x.XPathSelectElement("ChrNote/note") == null ? "" : x.XPathSelectElement("ChrNote/note").Value, Definitions = Definitions.Select(y=> new { Extension = y.Value, Char = y.Attribute("char").Value }) }; Console.WriteLine ("{0}", result.First().Note); foreach (var definition in result.First().Definitions) { Console.WriteLine ("{0}, {1}", definition.Extension, definition.Char); } 

これはあなたに次のような出力が得られます。 – Nikolas