Как использовать xml для linq, когда у меня нет схемы Google Reader Atom? - PullRequest
1 голос
/ 11 января 2009

Я работаю над небольшим виджетом для BlogEngine.Net. Мой виджет будет принимать атомную ленту общих элементов пользователя и печатать заголовок, URL веб-сайта, дату и URL атома. Для выполнения этой задачи я начал использовать Linq и XML.

Вот проблема. Канал атома, который использует Google Reader, находится в элементе источника, который имеет атрибут gr: stream-id. Видимо, XName не нравится иметь двоеточия в имени. Мне пришлось пойти по этому пути, потому что схема Google Reader не существует. Если бы у меня была эта схема, это решило бы мою проблему. Как я могу получить схему?

Ниже приведен небольшой фрагмент моего кода:

protected void Page_Load(object sender, EventArgs e) {
    //Replace userid with the unique session id in your Google Reader 
    //url (the numbers after the F)
    getFeed("userid");
}

public class Post {
    public String title { get; set; }
    public DateTime published { get; set; }
    public String postUrl { get; set; }
    public String baseUrl { get; set; }
    public String atomUrl { get; set; }
}

private void getFeed(String userID) {
    String uri = "http://www.google.com/reader/public/atom/user%2F" + userID + "%2Fstate%2Fcom.google%2Fbroadcast";

    XNamespace atomNS = "http://www.w3.org/2005/Atom";
    //The Google Reader schema link does not exist :(
    XNamespace grNS = "http://www.google.com/schemas/reader/atom/";
    XDocument feed = XDocument.Load(uri);

    var posts = from item in feed.Descendants(atomNS + "entry")
                select new Post {
                    title = item.Element(atomNS + "title").Value,
                    published = DateTime.Parse(item.Element(atomNS + "published").Value),
                    postUrl = item.Element(atomNS + "link").Attribute("href").Value,
                    atomUrl = item.Element(atomNS + "source").Attribute(grNS + "href").Value
                };
    foreach (Post post in posts) {
        output.InnerHtml += "Title: " + post.title + "<br />";
        output.InnerHtml += "Published: " + post.published.ToString() + "<br />";
        output.InnerHtml += "Post URL: " + post.postUrl + "<br />";
        output.InnerHtml += "Atom URL: " + post.atomUrl + "<br />";
        output.InnerHtml += "<br />";
    }
}

Если есть другой способ, используя Linq и XML, пожалуйста, дайте мне знать. Заранее спасибо!

1 Ответ

1 голос
/ 11 января 2009

Я нашел альтернативное решение для получения URL фида атома. Однако я все же предпочел бы использовать Google Reader Atom Schema , потому что это обеспечило бы немного ясный код.

В ленте атомов есть элемент id, который выглядит следующим образом:

tag:google.com,2005:reader/feed/http://www.domain.com/blog/rss.xml

Итак, я добавил следующее в свой код Linq:

atomUrl = getUrl(item.Element(atomNS + "source").Element(atomNS + "id").Value)

С getUrl выглядит следующим образом:

private String getUrl(String item) {
    if (!item.Equals("")) {
        return item.Substring(item.IndexOf("http://"));
    }
    return "";
}

Этот код возвращает http://www.domain.com/blog/rss.xml

Это решение, кажется, работает с использованием пространств имен, но оно выполняет свою работу.

...