Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Imports Microsoft.VisualBasic
- Imports System.Web
- Imports System.Web.Configuration
- Imports System.Net
- Imports System.IO
- Imports System.Xml
- '
- '
- Public Class RssReader
- '
- '
- Public Function GetFeed(ByVal url As String, ByVal maxItems As Integer) As RssFeed
- '
- Dim feed As RssFeed = New RssFeed()
- Dim _item As RssItem = Nothing
- Dim request As WebRequest
- Dim response As WebResponse
- Dim rssStream As Stream
- Dim rssDoc As New XmlDocument()
- Dim rssItems As XmlNodeList
- Dim rssHeader As XmlNodeList
- Dim rssDetail As XmlNode
- Dim upperlimit As Integer = maxItems
- Dim itemtitle As String = ""
- Dim itemlink As String = ""
- Dim itemdate As Date = Date.MinValue
- feed.URL = url
- If upperlimit > 50 Then
- upperlimit = 50
- End If
- If upperlimit <= 0 Then
- Return feed
- End If
- Try
- request = WebRequest.Create(url)
- request.Timeout = 3000
- response = request.GetResponse()
- rssStream = response.GetResponseStream()
- rssDoc.Load(rssStream)
- rssStream.Close()
- '
- ' Attempt retrieval for RSS v2.0
- rssHeader = rssDoc.SelectNodes("rss/channel")
- If rssHeader.Count < 1 Then
- ' Attempt retrieval for RSS v0.90, v0.91, v1.0
- rssHeader = rssDoc.SelectNodes("RDF/channel")
- End If
- If rssHeader.Count < 1 Then
- ' Attempt retrieval for Atom v1.0
- rssDoc = AtomToRssConverter(rssDoc)
- rssHeader = rssDoc.SelectNodes("rss/channel")
- End If
- If rssHeader.Count < 1 Then
- ' No matching XML nodes could be found, so this maynot be a valid RSS/Atom feed.
- Return feed
- End If
- rssDetail = rssHeader.Item(0).SelectSingleNode("title")
- If Not rssDetail Is Nothing Then
- feed.Title = rssDetail.InnerText
- End If
- rssDetail = rssHeader.Item(0).SelectSingleNode("description")
- If Not rssDetail Is Nothing Then
- feed.Description = rssDetail.InnerText
- End If
- rssDetail = rssHeader.Item(0).SelectSingleNode("subtitle")
- If Not rssDetail Is Nothing Then
- feed.Description = rssDetail.InnerText
- End If
- ' Attempt retrieval for RSS v2.0
- rssItems = rssDoc.SelectNodes("rss/channel/item")
- If rssItems.Count < 1 Then
- ' Attempt retrieval for RSS v0.90, v0.91, v1.0
- rssItems = rssDoc.SelectNodes("RDF/item")
- End If
- If rssItems.Count < 1 Then
- ' Attempt retrieval for Atom v1.0
- rssItems = rssDoc.SelectNodes("atom:feed/entry")
- End If
- '
- If rssItems.Count > 0 Then
- Dim i As Integer = 0
- While i < upperlimit
- rssDetail = rssItems.Item(i).SelectSingleNode("title")
- If Not rssDetail Is Nothing Then
- itemtitle = rssDetail.InnerText
- Else
- itemtitle = ""
- End If
- rssDetail = rssItems.Item(i).SelectSingleNode("link")
- If Not rssDetail Is Nothing Then
- itemlink = rssDetail.InnerText
- Else
- itemlink = ""
- End If
- rssDetail = rssItems.Item(i).SelectSingleNode("pubDate")
- If Not rssDetail Is Nothing Then
- If IsDate(rssDetail.InnerText) Then
- itemdate = CDate(rssDetail.InnerText)
- End If
- End If
- rssDetail = rssItems.Item(i).SelectSingleNode("updated")
- If Not rssDetail Is Nothing Then
- If IsDate(rssDetail.InnerText) Then
- itemdate = CDate(rssDetail.InnerText)
- End If
- End If
- '
- If itemtitle <> "" And itemlink <> "" Then
- _item = New RssItem
- _item.Title = itemtitle
- _item.Link = itemlink
- _item.PublishDate = itemdate
- feed.Items.Add(_item)
- End If
- i += 1
- End While
- End If
- '
- Catch ex As Exception
- '
- End Try
- '
- Return feed
- '
- End Function
- '
- '
- Public Class RssFeed
- '
- Dim _url As String = ""
- Dim _title As String = ""
- Dim _description As String = ""
- Dim _items As List(Of RssItem) = New List(Of RssItem)()
- '
- Public Property URL() As String
- Get
- Return _url
- End Get
- Set(ByVal value As String)
- _url = value
- End Set
- End Property
- '
- Public Property Title() As String
- Get
- Return _title
- End Get
- Set(ByVal value As String)
- _title = value
- End Set
- End Property
- '
- Public Property Description() As String
- Get
- Return _description
- End Get
- Set(ByVal value As String)
- _description = value
- End Set
- End Property
- '
- Public Property Items() As List(Of RssItem)
- Get
- Return _items
- End Get
- Set(ByVal value As List(Of RssItem))
- _items = value
- End Set
- End Property
- '
- End Class
- '
- '
- Public Class RssItem
- '
- '
- Dim _title As String = ""
- Dim _link As String = ""
- Dim _pubDate As Date = Date.MinValue
- '
- Public Property Title() As String
- Get
- Return _title
- End Get
- Set(ByVal value As String)
- _title = value
- End Set
- End Property
- '
- Public Property Link() As String
- Get
- Return _link
- End Get
- Set(ByVal value As String)
- _link = value
- End Set
- End Property
- '
- Public Property PublishDate() As Date
- Get
- Return _pubDate
- End Get
- Set(ByVal value As Date)
- _pubDate = value
- End Set
- End Property
- '
- '
- End Class
- '
- '
- 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
- '
- '
- End Class
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement