使用C#ASP.NET内容读取rss2 feed:编码标记

时间:2014-04-30 15:01:52

标签: c# asp.net xml rss rss2

我正在尝试从Word Press博客阅读rss2提要。我找到了这方面的例子,包括我在这里为我的代码改编的那个。问题是它没有读取内容:编码标签。我搜索并找到了其他有这个问题的人,但似乎没有解决任何问题。

我在asp.net页面上使用转发器,后面有C#代码来显示数据。

问题似乎是内容:编码标签未在http://purl.org/dc/elements/1.0/modules/content/中定义我已经检查过它根本没有在那里列出。当我设置断点并检查值时,"内容"实际上是获得另一个标签的价值:" {0}"是第一篇文章被读入post对象后的值。虽然它从未在转发器中显示。

我认为必须一次在该URL上定义内容,因为这应该是一次性的。但现在还没有。

如果没有将XML作为字符串读取并重新发明轮子来读取标签,那么有一种已知的解决方法吗?是否有我可以提供的链接,它将定义要使用的代码的内容标记? (我假设这是URLS的目的)。我可以用定义创建自己的页面吗?

这是背后的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Xml.Linq;

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

        // Load the blog posts 
        string sURL1 = "http://www.stellman-greene.com/feed";
        string sURL2 = "http://arnottsuspension.com/?feed=rss2";
        XDocument ourBlog = XDocument.Load(sURL2);


        // Query the <item>s in the XML RSS data and select each one into a new Post()
        IEnumerable<Post> posts =
            from post in ourBlog.Descendants("item")
            select new Post(post);
        postRepeater.DataSource = posts;
        postRepeater.DataBind();




    }
    class Post
    {
        public string Title { get; private set; }
        public DateTime? Date { get; private set; }
        public string Url { get; private set; }
        public string Description { get; private set; }
        public string Creator { get; private set; }
        public string Content { get; private set; }

        private static string GetElementValue(XContainer element, string name)
        {
            if ((element == null) || (element.Element(name) == null))
                return String.Empty;
            return element.Element(name).Value;
        }

        public Post(XContainer post)
        {
            // Get the string properties from the post's element values
            Title = GetElementValue(post, "title");
            Url = GetElementValue(post, "guid");
            Description = GetElementValue(post, "description");
            Creator = GetElementValue(post,
                "{http://purl.org/dc/elements/1.1/}creator");
            Content = GetElementValue(post,
               "{http://purl.org/dc/elements/1.0/modules/content/}encoded");

            // The Date property is a nullable DateTime? -- if the pubDate element
            // can't be parsed into a valid date, the Date property is set to null
            DateTime result;
            if (DateTime.TryParse(GetElementValue(post, "pubDate"), out result))
                Date = (DateTime?)result;
        }

        public override string ToString()
        {
            return String.Format("{0} by {1}", Title ?? "no title", Creator ?? "Unknown");
        }
    }

}

这是HTML / ASP:

   <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>


       <asp:Repeater ID="postRepeater" runat="server">
           <ItemTemplate>
               <tr>
                   <td><%# Eval("Title") %></td><br />
               </tr>
               <tr>
                   <td><%# Eval("Description") %></td><br />
               </tr>
               <tr>
                   <td><%# Eval("Content") %></td><br />
               </tr>
               <tr>
                   <td><a href="<%# Eval("URL") %>">Read More</a></td><br /><br />
               </tr>
           </ItemTemplate>


       </asp:Repeater>


    </div>
    </form>
</body>
</html>

1 个答案:

答案 0 :(得分:3)

我找到了正确的命名空间(如果这是用于此的正确术语。 我在哪里:

http://purl.org/dc/elements/1.0/modules/content/

我将其替换为:

http://purl.org/rss/1.0/modules/content/

它现在有效。