Visual Studio Tip of the Day Browser
I'm sitting here with writer's block on an article I'm supposed to be writing so in order to coax the technical writing muse I decided to write an application I've been meaning to do for over a month. If you didn't know, on Sara's blog she has a category called Visual Studio Tip of the Day where she posts little VS gems. I wanted to be able to easily search by my own keywords through all the tips she's posted so far so I figured it would be a simple LINQ to XML query to do it. I was right.
First I added the RSS schema using the XML to Schema new item template and pointed it to her blog's RSS feed. This added the RSS schema information (.xsd files) to my project in order to enable XML IntelliSense. Next I created a class called Tip that simply contains the properties that I was interested in from the feed; Published, Link, Title and Text.
Public Class Tip
Private m_link As String
Public Property Link() As String
Get
Return m_link
End Get
Set(ByVal value As String)
m_link = value
End Set
End Property
Private m_title As String
Public Property Title() As String
Get
Return m_title
End Get
Set(ByVal value As String)
m_title = value
End Set
End Property
Private m_date As Date
Public Property Published() As Date
Get
Return m_date
End Get
Set(ByVal value As Date)
m_date = value
End Set
End Property
Private m_text As String
Public Property Text() As String
Get
Return m_text
End Get
Set(ByVal value As String)
m_text = value
End Set
End Property
End Class
Next I loaded up an XDocument from her feed and started to write my query. What I want to end up with is a collection of my Tip objects I defined above. To do this, in your Select clause you use the syntax "Select New ClassName With {", like this:
Dim Feed = XDocument.Load("https://blogs.msdn.com/saraford/rss.xml")
Dim searchTerm = "*" & Me.TextBox1.Text.ToLower & "*"
'This is the fun part. Select the tips we want from Sara's rss feed.
' This query creates a collection of our Tip class.
Dim tips = _
From item In Feed...<item> _
Let Published = CDate(item.<pubDate>.Value).ToLocalTime _
Let Title = item.<title>.Value _
Let Link = item.<link>.Value _
Let Text = item.<description>.Value _
Let Category = item.<category>.Value _
Where Category IsNot Nothing AndAlso _
Category.ToLower Like "*tip of the day*" AndAlso _
(Title.ToLower Like searchTerm OrElse _
Text.ToLower Like searchTerm) _
Order By Published Descending _
Select New Tip With _
{.Published = Published, _
.Title = Title, _
.Link = Link, _
.Text = Text}
I've got a textbox on the form that I'm using to type in keywords to search through the titles and the text of all the posts in the feed. I use .ToLower so that the keyword search is case insensitive. Now that we have a collection of our Tip objects we can easily bind this to a DataGridView and display the selected tip's text (which is the description in the RSS) inside a WebBrowser control for instance.
Notice here, I typed the keyword "editor" and it found posts with both editor in the title and the description text. I've put the application into Code Gallery for you to play with. It does a couple additional things (unrelated to the LINQ query) like stores the URI in My.Settings, loads the rss feed only once per day (otherwise it loads from a cache file), as well as loading on a background thread so not to block the UI. You can also click on the hyperlink below the grid to navigate the WebBrowser to the actual post so you can add/view the post comments online.
Enjoy!
Comments
Anonymous
November 07, 2007
It would be useful to make this project more generalised by allowing the user to specify the URI to be searched.Anonymous
November 08, 2007
Mike, that would take you 10 seconds to change the code to do that. Seriously. Very cool example, Beth. It really illustrates the new powerful features and now I have a thousand things running through my mind on how I could use them! You're doing a pretty good job of getting me excited for the release, keep it up. Thanks!Anonymous
November 08, 2007
Oh, Mike, forgot to mention that the code looks for matches in the category node. So, if you want to change the URI to something else, that new URI had better have a category node with "tip of the day" in it or your getting no matches. Did you even read the post?!Anonymous
November 08, 2007
Hi Mike, you can easily add another textbox (I'd suggest with auto-complete) to capture the feed URI and then save that in My.Settings. With the category you can either allow the category to be entered in the UI as well or you can remove the category filter from the query and specify the tagged feed instead. i.e. For Sara's tip of the day feed you can directly access it here: http://blogs.msdn.com/saraford/rss_tag_Visual+Studio+2008+Tip+of+the+Day.xml Josh, I'm excited you're excited! :-)Anonymous
November 09, 2007
A small comment about running your application with Vista. I kept getting access denied for c:tiprss.xml, so i just moved it to another temp folder and it was working perfectly. I like you application and will add it to my R&D collection;) ashAnonymous
November 13, 2007
I made some modifications to my Visual Studio Tip of the Day browser application I created last week.Anonymous
November 14, 2007
What about support of http://dotnettipoftheday.org ? :)Anonymous
November 19, 2007
Welcome to the thirty-sixth issue of Community Convergence. This is the big day, with Visual Studio 2008Anonymous
November 19, 2007
Welcome to the thirty-sixth issue of Community Convergence. This is the big day, with Visual Studio 2008Anonymous
November 27, 2007
So what Turkey Day was last week?  No reason why we can't have a second helping of tip of the