2014-11-24 55 views
1

我有這個xml,我想反序列化,但問題是我無法在每一天都得到所有的<food>元素。有沒有辦法通過LINQ由linq反序列化xml,默認有很多元素

<foodplaces> 
    <foodplace> 
     <name> The Indian Restaurant</name> 
     <week> 47 </week> 
     <monday> 
      <food> Pasta </food> 
      <food> chineese food</food> 
      <food> veg food </food> 
     </monday> 
     -<tuesday> 
      <food> Indian food</food> 
      <food> Veg food </food> 
     </tuesday> 
    </foodplace> 

    <name> Restauran Italian </name> 
    <week> 47 </week> 
    -<monday> 
     <food> Pizza </food> 
     <food> Checken  </food> 
     <food> sallad </food> 
    </monday> 
    -<tuesday> 
     <food> Fish </food> 
     <food> ris </food> 
     <food> Biff </food> 
     <food> Checken </food> 
    </tuesday> 
</foodplaces> 

反序列化,並具有這些類

public class tuesday 
{ 
    private string[] _foods = new string[3]; 
    public string food1 
    { 
     set { _foods[0] = value; } 
    } 
    public string food2 
    { 
     set { _foods[1] = value; } 
    } 
    public string food3 
    { 
     set { _foods[2] = value; } 
    } 
} 

public class foodplace 
{ 
    private string _name; 
    private string _week; 
    public string name 
    { 
     get { return _name; } 
     set { _name = value; } 
    } 
    public string week 
    { 
     get { return _week; } 
     set { _week = value; } 
    } 
    public monday m = new monday(); 
    public tuesday t = new tuesday(); 
} 

而且有這樣的代碼從XmlDocument反序列化數據的類,但它似乎沒有工作

foodplace fd = new foodplace(); 

List<foodplace> foodplaces = 
    (from _foodplace in xdocument.Element("foodplaces").Elements("foodplace") 
    select new foodplace 
    { 
     name = _foodplace.Element("name").Value, 
     week = _foodplace.Element("week").Value,   
     m = (from _day in _foodplace.Elements("monday") 
       select new tuesday 
       {     
        food1 = _day.Element("food").Value, 
        food2 = _day.Element("food").Value,     
        food3 = _day.Element("food").Value      
       }) 
+1

你爲什麼以這種方式反序列化?那麼'XmlSerializer'呢? – 2014-11-24 19:03:32

+0

cus xml在URl鏈接上,我想在每個元素分配給它之前檢查和修改每個元素。 – 2014-11-24 19:06:09

+0

在你的setter中驗證它們。 – 2014-11-24 19:09:59

回答

0

你這裏有一些錯誤:

  1. 「意大利餐廳」的XML未包含在<foodplace> </foodplace>中。它應該是。

  2. 您選擇名爲「星期一」元素,它們的數據存儲在tuesday類,它們將它們設置在m領域,這是一個monday。當然,這些都應該是「星期一」。你甚至修復了你的編譯器錯誤嗎?

  3. 有三個food元素,所以您必須通過它們來枚舉,類似於您對foodplace元素所做的操作。 _day.Element("food").Value(重複)獲得第一個。

因此,下面是一個修復:

 string xml = @" 
     <foodplaces> 
      <foodplace> 
       <name> The Indian Restaurant</name> 
       <week> 47 </week> 
       <monday> 
        <food> Pasta </food> 
        <food> chineese food</food> 
        <food> veg food </food> 
       </monday> 
       <tuesday> 
        <food> Indian food</food> 
        <food> Veg food </food> 
       </tuesday> 
      </foodplace> 
      <foodplace> 
       <name> Restauran Italian </name> 
       <week> 47 </week> 
       <monday> 
        <food> Pizza </food> 
        <food> Checken  </food> 
        <food> sallad </food> 
       </monday> 
       <tuesday> 
        <food> Fish </food> 
        <food> ris </food> 
        <food> Biff </food> 
        <food> Checken </food> 
       </tuesday> 
      </foodplace> 
     </foodplaces> 
     "; 

而且

 List<foodplace> foodplaces = 
      (from _foodplace in xdocument.Element("foodplaces").Elements("foodplace") 
      select new foodplace 
      { 
       name = _foodplace.Element("name").Value, 
       week = _foodplace.Element("week").Value, 
       m = (from _day in _foodplace.Elements("monday") 
         let list = _day.Elements("food").Take(3).ToList() 
         select new monday 
         { 
          food1 = (list.Count > 0 ? list[0].Value : string.Empty), 
          food2 = (list.Count > 1 ? list[1].Value : string.Empty), 
          food3 = (list.Count > 2 ? list[2].Value : string.Empty), 
         }).FirstOrDefault(), 
      }).ToList(); 

這工作。

另外,爲monday,tuesday等分開的類似乎是錯誤的。根據需要制定基類RestaurantDay和子類。另外,我建議審查General Naming Conventions對於C#,你的代碼可能是更具可讀性,比如公共領域m應該成爲公共財產,像這樣:

public Monday Monday { get; set; } 
+0

我只是想要正確的linq語法來反序列化所有元素。 謝謝,這解決了我的問題 – 2014-11-25 18:52:46