VB. NET -  Criando um visualizador para RSS


Em meu artigo - VB.NET - Gerando RSS para compartilhar informações   criamos um gerador de RSS que você podia usar ou adaptar para gerar conteúdo RSS. Se você pretende apenas obter o conteúdo RSS existente na web a partir de um feed RSS pode obter diversos programas que atuam como leitores RSS.

Este artigo mostrar como criar o seu próprio visualizador de conteúdo RSS usando o Visual Basic 2005 Express Edition, acompanhando o artigo você aprenderá a usar alguns recursos do VB 2005 e ter um leitor de feeds RSS que você mesmo construiu.

Veja também o artigo : ASP.NET  2.0 - Criando um leitor para conteúdo RSS

Criando um visualizador RSS

A interface de nossa aplicação VB terá o seguinte leiaute:

Para chegar ao leiaute acima primeiro incluímos no formulário um Panel e um SplitContainer (fig 2.0) para em seguida preencher cada Panel do formulário com os controles apropriados. Assim em Panel1 incluimos um ListBox e em Panel2 incluímos um controle WebBrowser e um controle Panel com um controle LinkLabel.( fig 3.0)

Fig 2.0 - A divisão do formulário em 3 áreas Fig 3.0 - O preenchimento de cada área com os controles próprios

Vamos  usar duas classes :  RSSChannel.vb e RSSItem.vb para tratar as informações RSS visto o arquivo padrão RSS possui a estrutura : rss/channel/item , conforme abaixo:

O  RSS é apenas um arquivo XML com tags definidas que pode ser lido de forma a compartilhar informação.
Abaixo temos um exemplo de um arquivo RSS padrão:

<?xml version="1.0"?>
<rss version="2.0">
  <channel>
   <title>macoratti</title>
   <link>http://www.macoratti.net</link>
   <description>meu primeiro rss</description>
   <language>por-br</language>
   <copyright>Copyright (C) Nacoratti.net 2005</copyright>
   <lastBuildDate>data de hoje</lastBuildDate>
   <webMaster>macoratti@yahoo.com.br</webMaster>
   <ttl>1</ttl>
     <item>
         <title>Criando o RSS com VB.NET</title>
         <description>Este é meu programa para criar um RSS para compartilhar informações de um site.</description>
         <pubDate>novembro , 10 Nov 2005</pubDate>
     </item>
  </channel>
</rss>

Dando uma olhada nas tags principais temos:

<rss> È a tag raiz e possui um atributo version. A última versão é a 2.0
<channel> A raiz rss pode conter tags <channel>. Esta tag contém também outras tags como : <title> , <link> e <item>
<title> representa o título do RSS
<link> representa a URL do web site fornecedor do rss.
<description> detalha as informações do rss
<copyright> informação de copyright

<generator>

Nome do programa ou aplicação que gera o rss.
<rating> Avaliação do canal
<skipHours> Tempo em que estará disponível
<author> E-mail do autor da notícia

Quando você executa o projeto , tudo começa no evento Load do formulário que chama a rotina preenchecombo() para preencher o controle ComboBox com os dados da tabela feeds do banco de dados rss.mdb. A combobox irá exibir o valor do campo link definido na propriedade DisplayMember.

Private Sub RSSVisualizador_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load


cboCanal.DataSource = preenchecombo()

cboCanal.DisplayMember = "link"

cboCanal.ValueMember = "link"


lblTitulo.Text =
""

lblDescricao.Text = ""

linkChannel.Text = ""

linkChannel.Links.Add(0, 1, "")

linkItemURL.Text = ""

linkItemURL.Links.Add(0, 1, "")


RefreshChannel()

 

End Sub

A rotina preenchecombo() usa um objeto DataReader para acessar a tabela feeds e retorna um objeto DataTable. Observe que usei o método Load do DataTable para carregar a tabela a partir do DataReader. (dt.Load(dr) )

Na versão anterior da ADO.NET , os objetos DataTable eram originalmente membros dos objetos DataSets. Com o advento da ADO.NET 2.0 isso mudou.

A nova versão permite que você crie objetos DataTable mais 'leves' que compartilham muitos métodos antes somente existentes no DataSet. Agora os objetos Datatable suportam os métodos : ReadXml, ReadXmlSchema, WriteXml e WriteXmlSchema , Load(DataReader) e o objeto DataTableReader.

Você pode também atribuir um namespace e um prefixo namespace ao DataTable.

Private Function preenchecombo()
 

Dim strConn As String

Dim dr As OleDbDataReader

Dim dt As New DataTable

Dim comando As OleDbCommand

Dim sql As String

Dim conexao As OleDbConnection


strConn = "Provider = Microsoft.Jet.OLEDB.4.0;"

strConn &= "Data Source = c:\teste\rss.mdb"

sql = "SELECT * FROM feeds"


conexao = New OleDbConnection(strConn)


Try

   conexao.Open()

   comando = New OleDbCommand(sql, conexao)

   dr = comando.ExecuteReader(CommandBehavior.CloseConnection)

   dt.Load(dr)

Catch

   MsgBox("Erro de acesso aos dados.")

End Try


Return dt
 

End Function

Nota:  Não esqueça de declarar os namespaces para acesso aos dados no projeto :

Imports System.Data.oledb
Imports System.data

Após retornar o DataTable que será usado para preencher a combobox, ao final da rotina é feita a chamada para a rotina RefreshChannel(). O código da mesma é o seguinte:

Private Sub RefreshChannel()
 

If cboCanal.Text <> "" Then

   
    Dim channel As New RSSChannel(cboCanal.Text)

 

    lblTitulo.Text = channel.Title

    lblDescricao.Text = channel.Description

    linkChannel.Text = channel.Link

    linkChannel.Links(0).Start = 0

    linkChannel.Links(0).Length = channel.Link.Length

    linkChannel.Links(0).LinkData = channel.Link


    feedItems = channel.GetChannelItems()

    lbItems.DisplayMember = "Title"

    lbItems.ValueMember = "link"

    lbItems.DataSource = feedItems

End If

End Sub

Nesta rotina criamos uma instância da classe RSSChannel() passando como parâmetro o link do feed RSS. A classe RSSChannel define as seguintes propriedades e métodos:

Propriedades:

Private m_FeedURL As String

Private m_Title As String

Private m_Link As String

Private m_Description As String

Métodos:

1 - GetXMLDoc - Responsável por obter os dados RSS via requisição web.

Private Function GetXMLDoc(ByVal node As String) As XmlNodeList


Dim tempNodeList As System.Xml.XmlNodeList = Nothing

Dim request As WebRequest = WebRequest.Create(Me.FeedURL)

Dim response As WebResponse = request.GetResponse()

Dim rssStream As Stream = response.GetResponseStream()

Dim rssDoc As XmlDocument = New XmlDocument()


rssDoc.Load(rssStream)


tempNodeList = rssDoc.SelectNodes(node)

Return tempNodeList


End Function

Este método usa a classe WebRequest definido no namespace System.Net para criar o objeto request através do método Create para acessar dados via requisição web. (Esta classe é uma classe abstrata e não pode ser usada diretamente)

Para obter a resposta do servidor estamos usando o método GetResponse() do objeto WebRequest.

Para obter um stream dos dados usamos o método GetResponseStream() do objeto WebResponse.

Em seguida via método Load carregamos os dados no formato XML: rssDoc.Load(rssStream)

2- GetChannelInfo - Obtém informação do canal chamando através da chamada da função :  GetXMLDoc("rss/channel")

3-  GetChannelItems() - Obtém a informação do itens chamando a função : GetXMLDoc("rss/channel/item")

Sempre que o usuário clicar em um item exibido no controle ListBox(lbltems), que representa os dados já carregados, as informações no controle WebBrowser será atualizados graças ao evento SelectedIndexChanged que possui o seguinte código:

Private Sub lbItems_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)
                Handles lbItems.SelectedIndexChanged


If lbItems.Items.Count > 0 Then
 

    Dim currentItem As RSSItem

    currentItem = feedItems(lbItems.SelectedIndex)

    WebBrowser1.DocumentText = currentItem.Description

    linkItemURL.Text = currentItem.Link

    linkItemURL.Links(0).Start = 0

    linkItemURL.Links(0).Length = currentItem.Link.Length

    linkItemURL.Links(0).LinkData = currentItem.Link
 

End If

End Sub

Para atualizar os dados o usuário deve selecionar um novo item no ComboBox(CboCanal) e  clicar no botão Atualizar o para  refazer o processo através da chamada da função RefresChannel():

Private Sub btnRefresh_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRefresh.Click

    RefreshChannel()

End Sub

No evento Click dos controles LinkLabels estamos efetuando a chamada ao link selecionado usando o seguinte código:

Private Sub linkItemURL_LinkClicked(ByVal sender As System.Object, ByVal e As System.Windows.Forms.LinkLabelLinkClickedEventArgs) Handles linkItemURL.LinkClicked

   System.Diagnostics.Process.Start(linkItemURL.Links(0).LinkData)

End Sub

Private Sub linkChannel_LinkClicked(ByVal sender As System.Object, ByVal e As System.Windows.Forms.LinkLabelLinkClickedEventArgs) Handles linkChannel.LinkClicked

    System.Diagnostics.Process.Start(linkChannel.Links(0).LinkData)

End Sub

O resto é só alegria.

Executando o projeto teremos o seguinte resultado:

pegue o projeto completo aqui :  visualizaRSS.zip

Acompanhando este projeto você aprendeu alguns conceitos novos usados na versão 2.0 da plataforma .NET como a facilidade de acessar dados da internet com o controle WebBrowser e as classes WebRequest e WebResponse os novos recursos do DataTable como o método Load e aprendeu a usar classes para tratar informação.

Eu sei é apenas VB.NET, mas eu gosto...

E estamos conversados... 

Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti