2016-11-13 41 views
3

我對XML查詢LINQ是如何將XNode轉換爲自定義類型?

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

返回的

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

列表我如何轉換查詢的結果下面的類的列表?

/// <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

你的元素是XNode類型,代表XML元素。你可以不投,所以你需要使用new創建所需類型的對象:使用OfType<T>讓你跳過你的XML樹不是元素,例如節點

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

過濾XNode s下降至XElement註釋。

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

相關問題