代码之家  ›  专栏  ›  技术社区  ›  Portman

如何使用System.ServiceModel.Syndication从RSS提要读取“dc:creator”元素

  •  2
  • Portman  · 技术社区  · 16 年前

    脚本

    我正在使用一个RSS提要,它在某种程度上看起来像这样:

    <item>
        <title>Blog Title Here</title>
        <link>http://blogurl.com/2010/03/23/title/</link>
        <comments>http://blogurl.com/2010/03/23/title/#comments</comments>
        <pubDate>Tue, 23 Mar 2010 10:44:54 +0000</pubDate>
        <dc:creator>AuthorName</dc:creator>
        <category><![CDATA[CategoryName]]></category>
        <guid isPermaLink="false">http://blogurl.com/?p=102</guid>
        <description><![CDATA[Description of post content]]></description>
        <content:encoded><![CDATA[Full blog post here]]></content:encoded>
    </item>
    

    List<SyndicationItem> items;
    using (var reader = XmlReader.Create("http://blogurl.com/feed/"))
    {
      var formatter = new Rss20FeedFormatter();
      formatter.ReadFrom(reader);
      items = formatter.Feed.Items.ToList();
    }
    

    问题

    我不知道如何获取值 dc:创建者 元素。我相信我需要以某种方式使用ElementExtensions,但是我不确定语法,而且到处都找不到示例。

    1 回复  |  直到 16 年前
        1
  •  3
  •   Brian    16 年前

    下面是一个简短的F#示例,希望能引导您使用一些有用的API:

    let xml = @"
    <rss version=""2.0"">
    <channel xmlns:dc=""http://whatever.it.is/"" xmlns:content=""http://that.too/"">
    <title>testing</title>
    <item> 
        <title>Blog Title Here</title> 
        <link>http://blogurl.com/2010/03/23/title/</link> 
        <comments>http://blogurl.com/2010/03/23/title/#comments</comments> 
        <pubDate>Tue, 23 Mar 2010 10:44:54 +0000</pubDate> 
        <dc:creator>AuthorName</dc:creator> 
        <category><![CDATA[CategoryName]]></category> 
        <guid isPermaLink=""false"">http://blogurl.com/?p=102</guid> 
        <description><![CDATA[Description of post content]]></description> 
        <content:encoded><![CDATA[Full blog post here]]></content:encoded> 
    </item> 
    </channel>
    </rss>
    "
    
    open System.Xml 
    open System.IO
    open System.ServiceModel.Syndication
    let ReadIt() =
        use reader = XmlReader.Create(new StringReader(xml))
        let formatter = new Rss20FeedFormatter()
        formatter.ReadFrom(reader)
        let items = formatter.Feed.Items
        for item in items do
            // if I know there are dc:creator elements (that can deserialize with DataContract of type 'string')
            let dcCreators = item.ElementExtensions.ReadElementExtensions<string>("creator","http://whatever.it.is/")
            for dcc in dcCreators do
                printfn "dcc : %s" dcc
            // if just probing around
            for ee in item.ElementExtensions do
                printfn "extension `%s:%s'" ee.OuterNamespace ee.OuterName 
                use eer = ee.GetReader()
                let inner = eer.ReadInnerXml()
                printfn "    %s" inner
    ReadIt()