Poco tempo fa abbiamo parlato, in questo post, di come sia possibile leggere feed RSS tramite codice Visual Basic 2008, sfruttando il metodo Load della classe XDocument che, oltre a leggere documenti Xml, può recuperare da Internet contenuti nel medesimo formato.
Diverso tempo addietro, in quest'altro post, parlammo di un tool Microsoft chiamato Xml To Schema Inference Wizard, che aggiunge un modello di elemento a Visual Studio, in grado di generare schemi Xml a partire dai documenti Xml specificati. Grazie allo schema generato, viene abilitato il supporto di Intellisense anche nelle query LINQ-to-Xml che sfruttano la simbologia tipica di Visual Basic 2008, in particolare Descendants (...< >), Elements (.< >) e AttributeValue (.@).
Oggi uniamo il contenuto dei due post, per vedere come leggere feed RSS e scrivere una query LINQ che abbia il supporto di Intellisense. In primo luogo, dovete leggere i due post sopra citati! J
Questo perchè leggere i feed RSS è molto semplice con LINQ, ma non sempre si possono ricordare a memoria tutti gli elementi Xml che li costituiscono, quindi oggi vediamo come farlo aggiungendo il supporto di Intellisense.
Dopodichè, create un nuovo progetto per la Console e aggiungete un nuovo elemento di tipo Xml To Schema, chiamandolo, ad esempio, FeedSchema.xsd. Quando la finestra di Xml To Schema richiederà di specificare la sorgente Xml, utilizzate il pulsante Add From Web e, nella casella di testo che compare, specificate l'Uri da cui volete recuperare i feed, come ad esempio il seguente: http://community.visual-basic.it/alessandro/Rss.aspx che è l'indirizzo per i feed RSS di questo blog.
Dopo aver fatto clic su OK, Xml To Schema genera e aggiunge al progetto una serie di schemi in formato .Xsd che "mappano" la struttura Xml dei feed.
Attivando poi l'editor di codice, in primo luogo carichiamo in memoria i feed:
Dim doc As XDocument = XDocument.Load("http://community.visual-basic.it/alessandro/Rss.aspx")
Dopodichè, iniziamo con lo scrivere la query. Il codice è il seguente:
Dim query = From item In doc...<item> _
Let DataPubblicazione = CDate(item.<pubDate>.Value).ToLocalTime _
Let TitoloPost = item.<title>.Value _
Let Categoria = item.<category>.Value _
Order By DataPubblicazione Descending _
Select New With {.Data = DataPubblicazione, .Titolo = TitoloPost, .Categoria = Categoria}
Infine, scriviamo una semplice iterazione per mostrare i risultati:
For Each feed In query
Console.WriteLine("Data: {0}, Titolo post: {1}, Categoria: {2}", feed.Data, feed.Titolo, feed.Categoria)
Next
Console.ReadLine()
Durante la scrittura del codice, in particolare nell'aggiunta dei Descendants (...< >), avrete notato come, grazie ai namespace Xml mappati negli schemi, Intellisense mostri le alternative disponibili, come in qualunque altro tipo di situazione a cui siete abituati, sebbene con icone diverse, come in figura:

Di ulteriore interesse è il fatto che le informazioni selezionate (data di pubblicazione, titolo del post e categoria del post) confluiscono in tipi anonimi, assegnati a una collection che per inferenza è determinata come IEnumerable(Of anonymous types). Da ultimo, evidenziamo l'utilizzo della keyword Let che permette di assegnare un identificatore temporaneo alle informazioni su cui stiamo lavorando.
Se vi è utile, il codice è disponibile facendo clic qui sotto:
Alessandro