2016-11-13 1 views
3

私のLINQは、私は次のクラスのリストにクエリの結果を変換するにはどうすればよいXNodeをカスタムタイプにキャストするにはどうすればよいですか? XMLクエリに

<entry> 
    <key>keyName</key> 
    <value>valueName</value> 
</entry> 

のリストを返します

XDocument xdoc = XDocument.Load("test.xml"); 
IEnumerable<XNode> lv1s = from lv1 in xdoc.Descendants("resources") select lv1.FirstNode; 

のですか?

/// <remarks/> 
    [System.SerializableAttribute()] 
    [System.ComponentModel.DesignerCategoryAttribute("code")] 
    [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] 
    [System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)] 
    public partial class entry 
    { 

     private string keyField; 

     private string valueField; 

     /// <remarks/> 
     public string key 
     { 
      get 
      { 
       return this.keyField; 
      } 
      set 
      { 
       this.keyField = value; 
      } 
     } 

     /// <remarks/> 
     public string value 
     { 
      get 
      { 
       return this.valueField; 
      } 
      set 
      { 
       this.valueField = value; 
      } 
     } 
    } 

答えて

1

あなたが得る要素は、XMLの要素を表す、タイプXNodeのですが。ご希望のタイプのオブジェクトを作成するためにnewを使用する必要があるので、あなたは、それらをキャストすることはできません。

var converted = lv1s.OfType<XElement>().Select(lv1 => new entry { 
    key = lv1.Element("key").Value 
, value = lv1.Element("value").Value 
}); 

OfType<T>を使用してフィルタリングXElementまでXNode sは、あなたが、例えば、要素ではありません、あなたのXMLツリーのノードをスキップすることができますコメント。

3

あなたはXElementの代わりXNodeで仕事ができると、あなたのような何かを行うことができます。

IEnumerable<entry> lv1s = from lv1 in xdoc.Descendants("resources") 
          select new entry { 
            key = lv1.Element("key").Value, 
            value = lv1.Element("value").Value 
          }; 
+0

コレクションをリストにする必要がある場合は、最後に '.ToList()'をスリングすることができます – Braydie

関連する問題