2015-02-12 51 views
0

我有兩個類和下面的XML。我不知道如何從以下XML中創建Director和Movie的對象。我想使用Linq,但嘗試了很多東西,但並不確定。跨兩個類提取的XML數據

我想擁有所有導演對象及其ID,我希望所有電影對象都具有其所有字段。

public class Director 
{ 
public int DirectorID; 
public string Name; 
} 

public class Movie 
{ 
public string DirectorID; 
public string Genre; 
public string Rating; 
public string MovieName; 
} 



<?xml version="1.0" encoding="UTF-8"?> 
<Movie xmlns="http://www.imdb.co.uk" CreationDate="2015-01-25T18:14:33" year="2012" NumberOfMovies="6"> 
    <DirectorMovie> 
     <Director> 
     <Name>Ridley Scott</Name> 
     </Director> 
     <Movie> 
     <Genre>Horror</Genre> 
     <Rating>8.9</Rating> 
     <MovieName>Alien</MovieName> 
     </Movie> 
     <Movie> 
     <Genre>Sci-Fi</Genre> 
     <Rating>8.7</Rating> 
     <MovieName>Blade Runner</MovieName> 
     </Movie> 
     <Movie> 
     <Genre>Action</Genre> 
     <Rating>7.4</Rating> 
     <MovieName>Black Hawk Down</MovieName> 
     </Movie> 
    </DirectorMovie> 
    <DirectorMovie> 
     <Director> 
     <Name>James Cameron</Name> 
     </Director> 
     <Movie> 
     <Genre>Action</Genre> 
     <Rating>8.9</Rating> 
     <MovieName>Aliens</MovieName> 
     </Movie> 
     <Movie> 
     <Genre>Sci-Fi</Genre> 
     <Rating>8.5</Rating> 
     <MovieName>Avatar</MovieName> 
     </Movie> 
     <Movie> 
     <Genre>Action</Genre> 
     <Rating>8.8</Rating> 
     <MovieName>Prometheus</MovieName> 
     </Movie> 
    </DirectorMovie> 
</Movie> 
+1

<默認註釋>你嘗試過什麼到目前爲止? oopbase 2015-02-12 08:53:06

+0

哪裏是'DirectorID'在你的XML? – 2015-02-12 09:11:06

回答

1

我想,這將幫助你與你想要的 - 我假設id是自動生成的。

int iID = 1; 
     XNamespace xn = "http://www.imdb.co.uk"; 
     // List of individual directors; 
     var list = xeDir.Descendants(xn + "DirectorMovie").Select(item => new Director() 
                { 
                 DirectorID = iID++, 
                 Name = item.Element(xn + "Director").Element(xn + "Name").Value 
                }); 

     // Dictionary of directors name vs movies list. 
     var movList = xeDir.Descendants(xn + "DirectorMovie"). 
      ToDictionary(dir => dir.Element(xn + "Director").Element(xn + "Name").Value, 
              dir => dir.Elements(xn + "Movie"). 
               Select(mov => new Movie() 
              { 
               Genre = mov.Element(xn + "Genre").Value, 
               MovieName = mov.Element(xn + "MovieName").Value, 
               Rating = mov.Element(xn + "Rating").Value, 
               DirectorID = list.Where(item => item.Name == dir.Element(xn + "Director").Element(xn + "Name").Value).First().DirectorID.ToString() 

              }) 
         ); 
1

首先,要小心如何定義你的班級。目前,您已經創建了僅具有公共屬性的類,這可能不是您想要執行的操作。檢查如何創建propertiesauto-implemented properties

然後,在分析方面,這是相當簡單的使用LINQ to XML(代碼已經無論如何也不能過測試,還遠遠沒有完成,因爲一些使用上手):

var doc = XDocument.Parse(xmlData); 

var movieElement = doc.Element("Movie") 
         .Elements("DirectorMovie") 
         .Elements("Movie") 
         .Select(x => new Movie{ 
          DirectorId = GetDirectorIdFromName(x.Parent.Element("Director").Element("Name").Value), 
          Genre = x.Element("Genre").Value 
         });