To get a sense of how LINQ to XML works, we
can create a simple XML file on our local file-system like below that uses a
custom schema we've defined to store RSS feeds:
Figure 1
I could then use the new XDocument class
within the System.Xml.Linq namespace to open and query the XML document
above. Specifically, I want to filter the <Feed> elements in the
XML file and return a sequence of the non-disabled RSS feeds (where a disabled
feed is a <Feed> element with a "status" attribute whose
value is "disabled"). I could accomplish this by writing the
code below:
VB:
Figure 2
C#:
Figure 3
Notice in the code-snippets above how I'm loading the XML
file using the XDocument.Load(path) static method - which returns back an
XDocument object. Because I'm running this code within ASP.NET, I'm using
the Server.MapPath(path) helper method to resolve the correct path for my XML
file relative to the page I'm running the code on.
Once I have an XDocument object for my XML file I can then
write a LINQ query expression to retrieve the XML data I'm looking for.
In the code above I'm querying over each of the <Feed> elements within
the XML file. This is driven by this opening clause in the LINQ query
expression:
from feed in feedXML.Decedents("Feed")
I'm then applying a filter that only returns back those
"Feed" elements that either don't have a "status"
attribute, or whose "status" attribute value is not set to
"disabled":
Where (feed.Attribute("status") Is Nothing) OrElse (feed.Attribute("status").Value <> "disabled")
I am then using the select clause in our LINQ expression to
indicate what data I want returned. If I simply wrote "select
feed", LINQ to XML would return back a sequence of XElement objects that
represents each of the XML element nodes that match my filter. In the
code samples above, though, I am using the shaping/projection features of LINQ
to instead define a new anonymous type on the fly, and I am defining two properties
on it - Name and Feed - that I want populated using the <Name> and
<Url> sub-elements under each <Feed> element:
Select Name = feed.Element("Name").Value, Url = feed.Element("Url").Value
As you can see above (and below), I can then work against this
returned sequence of data just like I would any collection or array in
.NET. VS 2008 provides full intellisense and compilation checking support over this anonymous type sequence:
Figure 4
I can also data-bind the results against any
UI control in ASP.NET, Windows Forms, or WPF. For example, assuming I had
a dropdownlist control defined in my page like so:
Figure 5
I could use the below LINQ to XML code to databind the
results to it:
Figure 6
This will then produce a nice drop-downlist in
our HTML page like so:
Figure 7