Как десериализовать схему с массивом схем из файла opml

Я десериализирую файл opml, в котором есть один контур с большим количеством контуров внутри. Подобно:

    <outline text="Stations"...>
           <outline.../>
           <outline.../>
            .....
    </outline>

После этого есть более необычные очертания:

    <outline/>
    <outline/>

Теперь я хочу десериализовать только контуры внутри контура "Станция". Если я использую прямой Xml.Deserializer, он всегда включает все контуры.

У меня есть класс Outline следующим образом:

     public class Outline
  {
    public string Text { get; set; }
    public string URL { get; set; }
  }

Я использую Restsharp, чтобы получить ответ, подобный этому:

        RestClient client = new RestClient("http://opml.radiotime.com/");
        RestRequest request = new RestRequest(url, Method.GET);
        IRestResponse response = client.Execute(request);
        List<Outline> outlines = x.Deserialize<List<Outline>>(response);

Я получаю ответ успешно, никаких проблем нет, но я хочу только данные из схемы "Станция".

Как мне это сделать? Как выбрать схему "Станции"?

Я попытался десериализовать с помощью этого класса:

  public class Outline
  {
    public string Text { get; set; }
    public string URL { get; set; }
    public Outline[] outline {get; set;}
  }

но это не работает, потому что только один контур имеет больше контуров внутри. Также я не могу просто удалить контуры из списка, потому что там меняются значения и имена.

Я хочу, чтобы каким-то образом контур "Station" был выбран "перед" десериализацией, а затем он анализирует остальные контуры внутри него. Как мне этого добиться?

Это URL для данных opml: http://opml.radiotime.com/Browse.ashx?c=local

Спасибо за помощь!

1 ответ

Решение

По сути, вы можете исключить это одним длинным оператором LINQ:

class Program
{
    public static void Main()
    {
        List<Outline> results = XDocument.Load("http://opml.radiotime.com/Browse.ashx?c=local")
                                   .Descendants("outline")
                                   .Where(o => o.Attribute("text").Value == "FM")
                                   .Elements("outline")
                                   .Select(o => new Outline
                                     {
                                       Text = o.Attribute("text").Value,
                                       URL = o.Attribute("URL").Value
                                     })
                                   .ToList();

    }     
}

public class Outline
{
    public string Text { get; set; }
    public string URL { get; set; }
}

Вы можете изменить эту строку: .Where(o => o.Attribute("text").Value == "FM") искать Station как ты и хотел, я просто использовал FM потому что на самом деле были данные для этого.

Другие вопросы по тегам