2009-12-28 7 views
0

Étant donné une URL, si elle a des nœuds RSS, alors j'ajoute à la base de données.Comment extraire Atom/RSS

par exemple .:

Pour this URL, rssDoc.SelectNodes("rss/channel/item").Count est supérieur à zéro. Mais pour the atom url, rssDoc.SelectNodes("rss/channel/item").count est égal à zéro.

Comment puis-je vérifier si l'URL Atom/RSS a des nœuds ou non? J'ai essayé pour rssDoc.SelectNodes("feed/entry").Count, mais me donne zéro compte.

Public Shared Function HasRssItems(ByVal url as string) As Boolean 
Dim myRequest As WebRequest 
Dim myResponse As WebResponse 
Try 
    myRequest = System.Net.WebRequest.Create(url) 
    myRequest.Timeout = 5000 
    myResponse = myRequest.GetResponse() 

    Dim rssStream As Stream = myResponse.GetResponseStream() 
    Dim rssDoc As New XmlDocument() 
    rssDoc.Load(rssStream) 

    Return rssDoc.SelectNodes("rss/channel/item").Count > 0 
Catch ex As Exception 
    Return False 
Finally 
    myResponse.Close() 
End Try 

End Function

Répondre

1

Votre principal problème ici est que le "chemin de noeud" XML sur cette ligne:

Return rssDoc.SelectNodes("rss/channel/item").Count > 0

est valable uniquement pour RSS feeds, non ATOM feeds. Une façon dont j'ai sur cela dans le passé est d'utiliser une fonction simple pour convertir un flux ATOM en flux RSS. Bien sûr, vous pouvez aller dans l'autre sens, ou ne pas convertir du tout, cependant, la conversion en un seul format vous permet d'écrire un morceau de code "générique" qui va extraire les différents éléments d'un flux que vous pourriez être intéressé dans (c.-à-d. date, titre, etc.)

Il existe un ATOM to RSS Converter article sur le projet de code qui fournit une telle conversion, cependant, en C#. Je l'ai déjà converti manuellement cela VB.NET moi-même, voici donc la version VB.NET:

Private Function AtomToRssConverter(ByVal atomDoc As XmlDocument) As XmlDocument 
    Dim xmlDoc As XmlDocument = atomDoc 
    Dim xmlNode As XmlNode = Nothing 
    Dim mgr As New XmlNamespaceManager(xmlDoc.NameTable) 
    mgr.AddNamespace("atom", "http://purl.org/atom/ns#") 
    Const rssVersion As String = "2.0" 
    Const rssLanguage As String = "en-US" 
    Dim rssGenerator As String = "RDFFeedConverter" 
    Dim memoryStream As New MemoryStream() 
    Dim xmlWriter As New XmlTextWriter(memoryStream, Nothing) 
    xmlWriter.Formatting = Formatting.Indented 
    Dim feedTitle As String = "" 
    Dim feedLink As String = "" 
    Dim rssDescription As String = "" 

    xmlNode = xmlDoc.SelectSingleNode("//atom:title", mgr) 
    If xmlNode Is Nothing Then 
      This looks like an ATOM v1.0 format, rather than ATOM v0.3. 
     mgr.RemoveNamespace("atom", "http://purl.org/atom/ns#") 
     mgr.AddNamespace("atom", "http://www.w3.org/2005/Atom") 
    End If 

    xmlNode = xmlDoc.SelectSingleNode("//atom:title", mgr) 
    If Not xmlNode Is Nothing Then 
     feedTitle = xmlNode.InnerText 
    End If 
    xmlNode = xmlDoc.SelectNodes("//atom:link/@href", mgr)(2) 
    If Not xmlNode Is Nothing Then 
     feedLink = xmlNode.InnerText 
    End If 
    xmlNode = xmlDoc.SelectSingleNode("//atom:tagline", mgr) 
    If Not xmlNode Is Nothing Then 
     rssDescription = xmlNode.InnerText 
    End If 
    xmlNode = xmlDoc.SelectSingleNode("//atom:subtitle", mgr) 
    If Not xmlNode Is Nothing Then 
     rssDescription = xmlNode.InnerText 
    End If 

    xmlWriter.WriteStartElement("rss") 
    xmlWriter.WriteAttributeString("version", rssVersion) 
    xmlWriter.WriteStartElement("channel") 
    xmlWriter.WriteElementString("title", feedTitle) 
    xmlWriter.WriteElementString("link", feedLink) 
    xmlWriter.WriteElementString("description", rssDescription) 
    xmlWriter.WriteElementString("language", rssLanguage) 
    xmlWriter.WriteElementString("generator", rssGenerator) 
    Dim items As XmlNodeList = xmlDoc.SelectNodes("//atom:entry", mgr) 
    If items Is Nothing Then 
     Throw New FormatException("Atom feed is not in expected format. ") 
    Else 
     Dim title As String = [String].Empty 
     Dim link As String = [String].Empty 
     Dim description As String = [String].Empty 
     Dim author As String = [String].Empty 
     Dim pubDate As String = [String].Empty 
     For i As Integer = 0 To items.Count - 1 
      Dim nodTitle As XmlNode = items(i) 
      xmlNode = nodTitle.SelectSingleNode("atom:title", mgr) 
      If Not xmlNode Is Nothing Then 
       title = xmlNode.InnerText 
      End If 
      Try 
       link = items(i).SelectSingleNode("atom:link[@rel= alternate ]", mgr).Attributes("href").InnerText 
      Catch ex As Exception 
       link = items(i).SelectSingleNode("atom:link", mgr).Attributes("href").InnerText 
      End Try 
      xmlNode = items(i).SelectSingleNode("atom:content", mgr) 
      If Not xmlNode Is Nothing Then 
       description = xmlNode.InnerText 
      End If 
      xmlNode = items(i).SelectSingleNode("//atom:name", mgr) 
      If Not xmlNode Is Nothing Then 
       author = xmlNode.InnerText 
      End If 
      xmlNode = items(i).SelectSingleNode("atom:issued", mgr) 
      If Not xmlNode Is Nothing Then 
       pubDate = xmlNode.InnerText 
      End If 
      xmlNode = items(i).SelectSingleNode("atom:updated", mgr) 
      If Not xmlNode Is Nothing Then 
       pubDate = xmlNode.InnerText 
      End If 
      xmlWriter.WriteStartElement("item") 
      xmlWriter.WriteElementString("title", title) 
      xmlWriter.WriteElementString("link", link) 
      If pubDate.Length < 1 Then 
       pubDate = Date.MinValue.ToString() 
      End If 
      xmlWriter.WriteElementString("pubDate", Convert.ToDateTime(pubDate).ToUniversalTime().ToString("ddd, dd MMM yyyy HH:mm:ss G\MT")) 
      xmlWriter.WriteElementString("author", author) 
      xmlWriter.WriteElementString("description", description) 
      xmlWriter.WriteEndElement() 
     Next 
     xmlWriter.WriteEndElement() 
     xmlWriter.Flush() 
     xmlWriter.Close() 
    End If 
    Dim retDoc As New XmlDocument() 
    Dim outStr As String = Encoding.UTF8.GetString(memoryStream.ToArray()) 
    retDoc.LoadXml(outStr) 
    Return retDoc 
End Function 

L'utilisation est assez simple. Chargez simplement votre flux ATOM dans un objet XmlDocument et transmettez-le à cette fonction, et vous obtiendrez un objet XmlDocument en format RSS!

Si vous êtes intéressé, j'ai mis un RSSReader class up on pastebin.com