2014-11-24 31 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