Десериализовать xml с помощью linq, по умолчанию со многими элементами

1

У меня есть этот 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                      
              })
  • 1
    Почему вы десериализовали таким образом? Как насчет XmlSerializer ?
  • 0
    Потому что xml находится на URl-ссылке, и я хочу проверить и изменить каждый элемент для любого внедрения перед назначением его классу.
Показать ещё 2 комментария
Теги:
deserialization
linq-to-xml
xml-serialization

1 ответ

0
Лучший ответ

У вас здесь несколько ошибок:

  1. XML для "Restauran Italian" не заключен в квадратные скобки в <foodplace> </foodplace>. Должен быть.

  2. Вы выбираете элементы с именем "monday", сохраняете их данные в классе 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 и подкласс по мере необходимости. Кроме того, я бы предложил рассмотреть общие соглашения об именах для С#, ваш код мог бы быть более читаемым, например, публичное поле m должно стать общедоступным следующим образом:

 public Monday Monday { get; set; }
  • 0
    я просто хотел правильный синтаксис linq для десериализации всех элементов. Спасибо, это решило мою проблему

Ещё вопросы

Сообщество Overcoder
Наверх
Меню