У меня есть этот xml, который я хочу десериализовать, но проблема в том, что я не могу получить все элементы <food>
в каждый день. Есть ли способ десериализовать его linq
<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
})
У вас здесь несколько ошибок:
XML для "Restauran Italian" не заключен в квадратные скобки в <foodplace> </foodplace>
. Должен быть.
Вы выбираете элементы с именем "monday", сохраняете их данные в классе tuesday
, их устанавливаете в поле m
, которое является monday
. Конечно, все должны быть "понедельника". Вы даже исправили ошибки компилятора?
Есть три элемента 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
и подкласс по мере необходимости. Кроме того, я бы предложил рассмотреть общие соглашения об именах для С#, ваш код мог бы быть более читаемым, например, публичное поле m
должно стать общедоступным следующим образом:
public Monday Monday { get; set; }
XmlSerializer
?