Alessandro Del Sole's Blog

{ A programming space about Microsoft® .NET® }
posts - 1908, comments - 2047, trackbacks - 352

My Links

News

Your host

This is me! Questo spazio è dedicato a Microsoft® .NET®, di cui sono molto appassionato :-)

Cookie e Privacy

Disabilita cookie ShinyStat

Microsoft MVP

My MVP Profile

Microsoft Certified Professional

Microsoft Specialist

Xamarin Certified Mobile Developer

Il mio libro su VB 2015!

Pre-ordina il mio libro su VB 2015 Pre-ordina il mio libro "Visual Basic 2015 Unleashed". Clicca sulla copertina per informazioni!

Il mio libro su WPF 4.5.1!

Clicca sulla copertina per informazioni! E' uscito il mio libro "Programmare con WPF 4.5.1". Clicca sulla copertina per informazioni!

These postings are provided 'AS IS' for entertainment purposes only with absolutely no warranty expressed or implied and confer no rights.
If you're not an Italian user, please visit my English blog

Le vostre visite

I'm a VB!

Guarda la mia intervista a Seattle

Follow me on Twitter!

Altri spazi

GitHub
I miei progetti open-source su GitHub

Article Categories

Archives

Post Categories

Image Galleries

Privacy Policy

Creare un aggregatore di feed RSS con VB 2008, WPF & LINQ - seconda parte

Riprendiamo in questo secondo post il tutorial, iniziato la scorsa volta, sulla creazione di un aggregatore di feed RSS con Visual Basic 2008, basato su Windows Presentation Foundation e che sfrutta LINQ-to-XML. Come anticipato nel primo, questa serie di post ci porterà a ricostruire l’applicazione che ho pubblicato in formato sorgente su CodePlex e intitolata “Custom WPF RSS Feed Aggregator”, che potete scaricare liberamente.

Nella “puntata” precedente abbiamo definito un file XML contenente l’elenco dei siti e una classe che rappresenti ciascun post. In questa fase cominciamo a predisporre il lavoro da svolgere attraverso LINQ. Poichè, come detto, i feed RSS sono null’altro che contenuti XML esposti da ciascun sito, noi utilizzeremo LINQ-to-XML per interrogare i feed ed estrarre i dati di nostro interesse. Ciò premesso, poichè le query in LINQ-to-XML non hanno un avanzato supporto di IntelliSense, possiamo abilitare questo ulteriore supporto attraverso l’inferenza di uno schema XML derivato dai feed RSS messi a disposizione dai siti Web, pratica che ci consentirà, per l’appunto, di avere maggiori funzionalità a disposizione nell’IDE di Visual Basic 2008 e facilitarci la vita J. Dal menu Project, selezionate il comando Add new item, quindi, al comparire dell’omonima finestra, dalla scheda Data selezionate il template XML To Schema, assegnando al nuovo file il nome FeedRSSSchema.Xsd:

 

 

Abbiamo parlato dell’inferenza di schemi XML in VB 2008 in questo precedente post. Dopo aver fatto clic su Add, comparirà la finestra (chiamata Infer XML Schema set from XML documents) del tool preposto alla generazione dello schema. La cosa bella di questo tool è che è in grado di generare schemi XML non solo da file esistenti, ma anche da contenuti XML sul Web; e, guarda caso, i feed RSS sono proprio contenuti XML sul Web! J Ciò posto, fate clic su Add from Web. Comparirà una piccola finestra, all’interno della quale andrà specificato l’URL dei feed (e non quello del sito/blog). La figura seguente illustra la specifica dell’URL dei feed del mio blog:

 

 

Probabilmente vi starete chiedendo: “ok, abbiamo i feed del tuo blog, ma per quelli degli altri?”. Lo schema XML a cui si rifanno i feed RSS è lo stesso per tutti, quindi possiamo utilizzare il link per il mio blog anche per tutti gli altri siti/blog (vantaggi di XML...). Dopo aver accettato la selezione, la finestra del tool di inferenza si presenta così:

 

 

Ora fate clic su OK ed attendete alcuni secondi affinché Visual Studio 2008 generi lo schema. Al termine dell’operazione, potete notare l’aspetto della finestra Solution Explorer che è il seguente:

 

 

A parte la presenza di alcuni file che fanno parte di passaggi successivi, soffermate la vostra attenzione sui 5 schemi .Xsd che Visual Studio ha aggiunto al progetto. Grazie a questi schemi, l’IntelliSense avrà piene funzionalità anche nelle query basate su LINQ-to-XML, come vedremo più avanti.

Iniziamo ora a scrivere un po’ di codice Visual Basic. Dei diversi metodi che ci occorre implementare, oggi vediamo i primi due: il primo, che esegue una query su ciascun indirizzo dei feed al fine di estrarre un elenco degli ultimi post; il secondo, che si occupa di ripulire dai caratteri speciali XML il testo ottenuto dalle interrogazioni. Come detto, ci saranno diversi altri metodi prevalentemente connessi all’utilizzo verso l’interfaccia grafica, pertanto, per non lasciare troppe cose in sospeso e per rendere più facile la comprensione delle cose, inizieremo a vederli nel prossimo post.

 

Detto questo, aggiungete al progetto una nuova classe, rappresentata da un file di codice chiamato HelperMethods.vb. La classe vuole esporre solo metodi condivisi, quindi la dichiariamo come NotInheritable:

 

NotInheritable Class HelperMethods

End Class

 

Il primo metodo che dovrà contenere questa classe ci permetterà di aprire un URL relativo ai feed, leggerne il contenuto sotto forma di oggetto XDocument e quindi di interrogare quest’ultimo oggetto al fine di ottenere le informazioni di nostro interesse. Il metodo, che poi commenteremo, è così predisposto:

 

    'Retrieves feeds from the specified URL and returns an IEnumerable collection

    Shared Function RetrieveFeeds(ByVal Address As String) As IEnumerable(Of BlogPost)

 

        Dim doc As XDocument = XDocument.Load(Address)

 

        Dim query = From item In doc...<item> _

        Let DataPubblicazione = CDate(item.<pubDate>.Value).ToLocalTime _

        Let TitoloPost = item.<title>.Value _

        Let Url = item.<link>.Value _

        Let Categoria = item.<category>.Value _

            Order By DataPubblicazione Descending _

            Select New BlogPost With _

            {.DatePublished = DataPubblicazione, .Title = EscapeXml(TitoloPost), _

             .Url = New Uri(Url), .Category = Categoria}

 

        Return query

    End Function

 

Il metodo legge il contenuto XML dei feed esposti dall’URL specificato, memorizzandolo in un oggetto doc di tipo XDocument. A colpo d’occhio, è evidente come il metodo XDocument.Load consenta di leggere contenuti XML non solo da file, ma anche dal Web.

 

La query expression fa questo: per ciascun elemento XML chiamato item (...<item> significa tutti i gli elementi <item> discendenti dalla root del documento), recupera la data di pubblicazione (pubDate) convertita nel formato del sistema, il titolo del post (title), l’indirizzo Internet (link) e la categoria (category). La keyword Let ci permette di assegnare identificatori temporanei a una serie di operazioni su oggetti o altre proprietà, che possono poi essere utilizzati in modo più comprensibile.

Il tutto viene ordinato in ordine decrescente (ossia dal più recente al più vecchio). Per ciascuno di questi elementi item viene istanziato un nuovo BlogPost, le cui proprietà sono assegnate mediante gli object initializer. Già durante la digitazione dei simboli tipici di LINQ-to-XML vi accorgerete di come l’IntelliSense vi suggerisca i possibili elementi da ottenere tramite le interrogazioni, risultato ottenuto grazie all’inferenza dello schema.

 

Il risultato dell’interrogazione confluisce in una collezione di tipo IEnumerable(Of BlogPost), che utilizzeremo poi come fonte dati per il data-binding all’interfaccia. Due cose da evidenziare: in primo luogo, abbiamo utilizzato la proprietà Value di ciascun contenuto che ci interessa ottenere poichè questa esegue automaticamente la conversione dei caratteri speciali XML nei corrispondenti in formato testo. Tuttavia, nei feed RSS spesso si verifica il problema del doppio encoding, pertanto questa prima scrematura non è sufficiente. A tale proposito viene richiamato un metodo EscapeXml, che riceve come argomento una stringa, che esegue una seconda pulizia.

 

Il metodo, sempre da implementare all’interno della classe HelperMethods, è di questo tipo:

 

    'Special characters in RSS Feeds are automatically cleaned by LINQ-to-Xml but often they

    'are double encoded, so this method filters feeds again by replacing

    'some of the special characters with corresponding text.

    Shared Function EscapeXml(ByVal DirtyXml As String) As String

 

        DirtyXml = DirtyXml.Replace("&amp;", "&")

        DirtyXml = DirtyXml.Replace("&lt:", "<")

        DirtyXml = DirtyXml.Replace("&gt", ">")

        DirtyXml = DirtyXml.Replace("&quot;", """")

        DirtyXml = DirtyXml.Replace("&apos;", "'")

        DirtyXml = DirtyXml.Replace("&ograve;", "ò")

        DirtyXml = DirtyXml.Replace("&egrave;", "è")

        DirtyXml = DirtyXml.Replace("&ugrave;", "ù")

        DirtyXml = DirtyXml.Replace("&agrave;", "à")

        DirtyXml = DirtyXml.Replace("&hellip;", "...")

 

        Return DirtyXml

    End Function

 

Nota bene: so che questo metodo non è perfetto, nel senso che c’è altra simbologia da gestire, sebbene questa sia sufficientemente ampia. Potete quindi eventualmente aggiungere i simboli da sostituire come preferite. Ad ogni buon conto, viene utilizzato il metodo di istanza Replace per sostituire una stringa con un’altra ma l’importante è ricordare che, affinchè la sostituzione abbia effetto, il risultato del metodo Replace deve essere assegnato a una stringa.

 

La scrittura di codice Visual Basic termina qui, almeno in questo post. Ma prima di lasciarvi, vediamo come fare una cosina interessante in WPF: aggiungere un’icona all’applicazione e alle singole finestre. Nel progetto sorgente trovate un file chiamato Feed.ico che potete utilizzare per questo tutorial, ma potete utilizzare qualunque icona che vi piaccia. Il file .ico si aggiunge al progetto mediante il comando Project|Add existing item. Per associare un’icona all’applicazione, aprite la finestra My Project e, nella scheda Application, espandete la Combobox relativa alla casella Icon. Nell’elenco troverete già il file aggiunto al progetto, vi basterà selezionarlo affinchè l’applicazione sia identificata da quell’icona:

 

 

 

Per associare un’icona a una finestra, invece, si seleziona da designer la finestra stessa e si utilizza la Finestra delle Proprietà per impostare la proprietà Icon, anch’essa contraddistinta da una casella combinata il cui elenco contiene i file di icona aggiunti al progetto. Basterà selezionare l’icona desiderata e il gioco è fatto:

 

 

Questa operazione aggiunge poi una proprietà Icon allo XAML della finestra:

 

<Window x:Class="Window1"

    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

    xmlns:local="clr-namespace:CustomFeedAggregator"

    Title="Developer feeds Aggregator" Height="600" Width="910"

    Icon="/CustomFeedAggregator;component/Feed.ico">

 

Non sembra, ma di cose ne abbiamo dette un bel po’ J  Vi aspetto alla terza puntata per iniziare a maneggiare WPF!

 

Leggi la prima parte

 

Alessandro

Print | posted on martedì 11 novembre 2008 21:32 | Filed Under [ .NET Framework Visual Basic Visual Studio 2008 Windows Presentation Foundation LINQ ]

Powered by:
Powered By Subtext Powered By ASP.NET