从 RSS 中的项目中提取图像和更多标签

Extract Image and More Tags from Item in RSS

我想从此 URL 中提取数据:http://rss.cnn.com/rss/edition.rss

所以每个项目看起来像这样:

      <item>
         <title><![CDATA[Ireland stuns England at home of cricket]]></title>
         <description><![CDATA[From World Cup glory to utter humiliation in the space of 10 days.]]></description>
         <link>https://www.cnn.com/2019/07/24/sport/england-ireland-cricket-spt-intl/index.html</link>
         <guid isPermaLink="true">https://www.cnn.com/2019/07/24/sport/england-ireland-cricket-spt-intl/index.html</guid>
         <pubDate>Wed, 24 Jul 2019 13:17:56 GMT</pubDate>
         <media:group>
            <media:content medium="image" url="https://cdn.cnn.com/cnnnext/dam/assets/190724131447-england-ireland-tease-01-super-169.jpg" height="619" width="1100" />
            <media:content medium="image" url="https://cdn.cnn.com/cnnnext/dam/assets/190724131447-england-ireland-tease-01-large-11.jpg" height="300" width="300" />
            <media:content medium="image" url="https://cdn.cnn.com/cnnnext/dam/assets/190724131447-england-ireland-tease-01-vertical-large-gallery.jpg" height="552" width="414" />
            <media:content medium="image" url="https://cdn.cnn.com/cnnnext/dam/assets/190724131447-england-ireland-tease-01-video-synd-2.jpg" height="480" width="640" />
            <media:content medium="image" url="https://cdn.cnn.com/cnnnext/dam/assets/190724131447-england-ireland-tease-01-live-video.jpg" height="324" width="576" />
            <media:content medium="image" url="https://cdn.cnn.com/cnnnext/dam/assets/190724131447-england-ireland-tease-01-t1-main.jpg" height="250" width="250" />
            <media:content medium="image" url="https://cdn.cnn.com/cnnnext/dam/assets/190724131447-england-ireland-tease-01-vertical-gallery.jpg" height="360" width="270" />
            <media:content medium="image" url="https://cdn.cnn.com/cnnnext/dam/assets/190724131447-england-ireland-tease-01-story-body.jpg" height="169" width="300" />
            <media:content medium="image" url="https://cdn.cnn.com/cnnnext/dam/assets/190724131447-england-ireland-tease-01-t1-main.jpg" height="250" width="250" />
            <media:content medium="image" url="https://cdn.cnn.com/cnnnext/dam/assets/190724131447-england-ireland-tease-01-assign.jpg" height="186" width="248" />
            <media:content medium="image" url="https://cdn.cnn.com/cnnnext/dam/assets/190724131447-england-ireland-tease-01-hp-video.jpg" height="144" width="256" />
         </media:group>
      </item>

所以我在互联网上找到了一些 类 应该注意这种情况的东西,例如:SyndicationFeed 或 XDocument.Parse

所以我尝试了这个:

XmlReader reader = XmlReader.Create(urle);
            SyndicationFeed feeds = SyndicationFeed.Load(reader); // References -> Right Click -> Add Reference -> System.ServiceModel
            reader.Close();

            foreach (SyndicationItem item in feeds.Items)
            {
                string subject = item.Title.Text;
                Console.WriteLine("subject: " + subject);
                if (item.Summary != null)
                {
                    string summary = item.Summary.Text;
                    Console.WriteLine("desc: " + summary);

                }


            }

它与 Title 和 Summary 一起工作得很好,但是它有处理图像的功能,那么我怎么能用 SyndicationFeed 来处理呢?

<media:group> 及其内容被视为扩展元素。

SyndicationFeed class 有一个 属性 ElementExtensions 来解决这些问题,
使用 ReadElementExtensions 方法来读取和解析它们。

创建一个 class 匹配 <media:group> xml 元素。

[XmlRoot("group", Namespace = "http://search.yahoo.com/mrss/")]
public class MediaGroup
{   
    [XmlElement(ElementName = "content", Namespace = "http://search.yahoo.com/mrss/")]
    public MediaContent[] Items { get; set;}
}

同时为 <media:content> 项创建一个 class 定义。

public class MediaContent
{
    [XmlAttribute("url")]
    public string Url {  get; set; }

    [XmlAttribute("height")]
    public int Height {  get; set; }

    [XmlAttribute("width")]
    public int Width {  get; set; }

    [XmlAttribute("medium")]
    public string Medium { get; set; }
}

使用 XmlSerializer 读取并解析它们,如下所示。

var serializer = new XmlSerializer(typeof(MediaGroup));
var mediaGroup = item.ElementExtensions
    .ReadElementExtensions<MediaGroup>("group", "http://search.yahoo.com/mrss/", serializer)
    .FirstOrDefault();
if (mediaGroup != null)
{
    foreach (var mediaItem in mediaGroup.Items)
    {
        Console.WriteLine(mediaItem.Url);
    }
}

完整代码:

using (var reader = XmlReader.Create(urle))
{
    var feeds = SyndicationFeed.Load(reader);

    var serializer = new XmlSerializer(typeof(MediaGroup));

    foreach (SyndicationItem item in feeds.Items)
    {
        string subject = item.Title.Text;
        Console.WriteLine("subject: " + subject);

        var mediaGroup = item.ElementExtensions
            .ReadElementExtensions<MediaGroup>("group", "http://search.yahoo.com/mrss/", serializer)
            .FirstOrDefault();
        if (mediaGroup != null)
        {
            foreach (var mediaItem in mediaGroup.Items)
            {
                Console.WriteLine(mediaItem.Url);
            }
        }                    
    }
}