如何使用opml文件中的轮廓数组反序列化轮廓

时间:2015-07-23 18:54:40

标签: c# xml rest serialization opml

我正在反序列化一个opml文件,该文件中有一个轮廓,其中包含更多轮廓。 像:

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

此后有更多单一的轮廓:

    <outline/>
    <outline/>

现在我想仅反序列化“Station”轮廓内的轮廓。如果我使用直接Xml.Deserializer,它总是包含所有轮廓。

我有一个类概要如下:

     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;}
  }

但这不起作用,因为只有一个Outline在其中有更多的轮廓。此外,我不能简单地从列表中删除轮廓,因为值和名称会改变。

我想要的是以某种方式在反序列化之前选择“站”轮廓,然后它解析其中的其余轮廓。我如何实现这一目标?

这是opml数据的网址: http://opml.radiotime.com/Browse.ashx?c=local

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

你可以在一篇很长的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,因为实际上有数据。