2013-03-13 77 views
1

我有以下代码用于从源XML创建对象列表。我可以在var query变量中得到要求的结果。从这个结果创建List<Video>的最佳方法是什么?使用LINQ从xml创建实体对象的最佳方法

注意:如果可能,请首选Method Chaining方法。

CODE

class Program 
{ 
    static void Main(string[] args) 
    { 
     string xmlStringInput = @"<videoShop> 
            <video title=""video1"" path=""videos\video1.wma""><Director>Speilberg</Director></video> 
            <video title=""video2"" path=""videos\video2.wma""/> 
           </videoShop>"; 

     XDocument myDoc = XDocument.Parse(xmlStringInput); 


     var videoElements = (from video in myDoc.Descendants("video") select video).ToList(); 
     foreach (var videoEle in videoElements) 
     { 
      //System.Xml.XPath namespace for XPathSelectElement 
      var directorName = videoEle.XPathSelectElement(@"Director"); 
     } 


     var query = from video in myDoc.Descendants("video") 
        select new 
        { 
         MyTitle = video.Attribute("title").Value, 
         MyPath = video.Attribute("path").Value 
        }; 

     //IEnumerable<XElement> elements = (IEnumerable<XElement>)query; 
     //List<Video> videoLibrary = (List<Video>)query.ToList<Video>(); 

     Console.WriteLine(query); 
     Console.ReadLine(); 

    } 

} 

实体

public class Video 
{ 
    public string MyTitle { get; set; } 
    public string MyPath { get; set; } 
} 

参考

  1. What's the most efficient way to locate and set element values in an XDocument?
  2. How do I get a list of child elements from XDocument object?
  3. Creating objects from XML
  4. C# LINQ with XML, cannot extract multiple fields with same name into object
  5. How to get XElement's value and not value of all child-nodes?

回答

6
var query = from vin myDoc.Descendants("video") 
      select new Video 
      { 
       MyTitle = (string)v.Attribute("title"), 
       MyPath = (string)v.Attribute("path") 
      }; 

// var means List<Video> here 
var results = query.ToList(); 

或者不query变量:

// var means List<Video> here 
var results = (from vin myDoc.Descendants("video") 
       select new Video 
       { 
        MyTitle = (string)v.Attribute("title"), 
        MyPath = (string)v.Attribute("path") 
       }).ToList(); 

基于方法的查询:

var results = myDoc.Descendants("video") 
        .Select(v => new Video() 
           { 
            MyTitle = (string)v.Attribute("title"), 
            MyPath = (string)v.Attribute("path") 
           }).ToList(); 
+2

这是由编译器完成的。它检测到,'var results'实际上是'List