Как десериализовать схему с массивом схем из файла 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
потому что на самом деле были данные для этого.