2009-01-11 6 views
1

Je travaille sur un petit widget pour BlogEngine.Net. Mon widget va prendre le flux atomique des éléments partagés d'une personne et imprimer le titre, l'url du site, la date et l'URL de l'atome. Pour compléter cette tâche, j'ai commencé à utiliser Linq et XML.Comment utiliser xml to linq lorsque je n'ai pas le Google Reader Atom Schema?

Voici le problème. Le flux atomique que Google Reader utilise se trouve dans l'élément source, qui possède un attribut gr: stream-id. Apparemment, le XName n'aime pas avoir des deux-points dans le nom. Je devais aller cette route parce que le Google Reader schema n'existe pas. Si j'avais ce schéma, cela résoudrait mon problème. Comment puis-je obtenir le schéma?

est Ci-dessous un petit extrait de mon code à ce jour:

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

S'il y a une autre façon d'aller à ce sujet tout en utilisant encore LINQ et XML, s'il vous plaît laissez-moi savoir. Merci d'avance!

Répondre

1

J'ai trouvé une solution alternative pour obtenir l'URL d'alimentation d'un atome. Cependant, je préférerais toujours utiliser le Google Reader Atom Schema car cela fournirait un code un peu clair.

Dans l'alimentation atomique, il y a un élément d'identification, qui ressemble à ceci:

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

J'ajouté ce qui suit à mon code Linq:

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

Avec getUrl qui ressemble à ceci:

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

Ce retour de code http://www.domain.com/blog/rss.xml

Cette solution semble tourner autour de l'utilisation des espaces de noms, mais elle fait le travail.