LINQ Cookbook, Recipe 8: Querying XML Using LINQ (Doug Rothaus)
Ingredients:
· Visual Studio 2008 (Beta2 or Higher)
Categories: LINQ-To-XML
Instructions:
· Create a new Console Application in Visual Basic.
· Create an RSS document. Add the following code to Sub Main.
Dim rss = <?xml version="1.0"?>
<rss version="2.0">
<channel>
<title>LINQ to XML in Visual Basic</title>
<description>Sample RSS Feed</description>
<language>en-us</language>
<pubDate>Tue, 18 Sep 2007 00:56:12 GMT</pubDate>
<item>
<title>Basic Instincts: Lambda Expressions</title>
<description>A new feature added to Visual Basic 9 to
support Language Integrated Queries (LINQ),
which adds data programmability to
Visual Basic.</description>
<pubDate>Thu, 27 Sep 2007 23:54:55 GMT</pubDate>
</item>
<item>
<title>Visual Basic Pack for Visual Studio 2005 SDK</title>
<description>The Visual Basic Pack for the Visual Studio
2005 SDK includes SDK samples converted into
the Visual Basic language and a new wizard for
generating Visual Basic-based integration
packages for Visual Studio.</description>
<pubDate>Mon, 17 Sep 2007 23:58:49 GMT</pubDate>
</item>
<item>
<title>XML to Schema Tool</title>
<description>The XML to Schema tool is a free project item
template to automate creation of XML schema
sets from any number of XML documents. If you
are working with Language Integrated Queries
(LINQ) to XML in Visual Basic 9, this utility
can significantly improve your editing
experience by adding XML schemas (.xsd files)
to your project that add IntelliSense for XML
properties.</description>
<pubDate>Mon, 17 Sep 2007 23:59:43 GMT</pubDate>
</item>
<item>
<title>Line and Shape Controls in the Power Packs</title>
<description>Download the latest version of the Visual
Basic 2005 Power Packs which now includes Line
and Shape controls that enable you to draw
lines, ovals, and rectangles on forms and
containers at design time making it much easier
to enhance the look of your user
interface.</description>
<pubDate>Mon, 20 Aug 2007 20:24:25 GMT</pubDate>
</item>
</channel>
</rss>
You use the same LINQ syntax to query XML in Visual Basic as you would to query a collection, data from SQL Server, and so on. The difference is in how you reference the XML elements and attributes. The XML features in Visual Basic enable you to reference XML elements and attributes as first class data objects. That is, you can use XML syntax in your object-oriented Visual Basic code.
For example, to reference the <channel> element from the XDocument object created earlier in this topic, you would simply code: rss.<rss>.<channel>. While this may seem to reference only one <channel> element, XML in Visual Basic actually returns a collection of all of the <channel> elements that are sub-elements of the <rss> object. You can then refer to particular items in the collection by index, or, as we’ll see in this topic, you can perform a LINQ query over that collection of elements. To refer to any descendant of an XML element, use the descendant syntax, “...” as in rss.<rss>...<title>. To refer to an attribute, use the attribute syntax, “@”, as in rss.<rss>.@version. These options for referring to elements and attributes in an XDocument or XElement object are called XML Axis Properties.
Note: The XML features in Visual Basic include XML IntelliSense, which provides selection lists for possible XML attributes and child elements when you are coding using LINQ to XML objects such as XDocument or XElement object. To enable XML IntelliSense in Visual Basic, you simply need to include an XML Schema Definition (XSD) file in your project. The XML tools in Visual Basic will even create an XSD file for you, based on the contents of an XML file, if you don’t have an XSD file. For more information, see XML IntelliSense in Visual Basic.
Using the XML Axis Properties available in Visual Basic, we can query the XML content using LINQ. For example, the following query performs a free text search of the content from the <title> and <description> elements of an <item> in an RSS feed. Add the code to Sub Main after the code that creates the XDocument object.
Dim itemList1 = From item In rss.<rss>.<channel>.<item> _
Where item.<description>.Value.Contains("LINQ") Or _
item.<title>.Value.Contains("LINQ")
Console.WriteLine("Items containing 'LINQ'" & vbCrLf)
For Each item In itemList1
Console.WriteLine(vbTab & "Title: " & item.<title>.Value)
Console.WriteLine(vbTab & "Description: " & item.<description>.Value)
Console.WriteLine()
Next
Note that the code example searches the Value property of an XML element to find a match. The Value property returns the contents of the XML element as a string. Without it, the XML Axis Property would return a collection of elements based on the element name. When searching XML attributes, you don’t need to specify the Value property. The XML Axis property will return the value of the first matching attribute, by default.
Because the Value property always returns a string, you may need to cast values as a particular type to perform your query. For example, the following code example searches for the items published in the last 20 days. Add the code to the end of Sub Main.
Dim itemList2 = From item In rss.<rss>.<channel>.<item> _
Let pubDate = DateTime.Parse(item.<pubDate>.Value) _
Where pubDate >= _
DateTime.Now.Subtract(New TimeSpan(20, 0, 0, 0)) _
Select item
Console.WriteLine("Items published in the last 20 days" & vbCrLf)
For Each item In itemList2
Console.WriteLine(vbTab & "Title: " & item.<title>.Value)
Console.WriteLine(vbTab & "Publish Date: " & item.<pubDate>.Value)
Console.WriteLine()
Next
Press F5 to see the code run.