Efficient way to construct an XML document from a string containing well formed XML for navigation?

.net, c#, xml

Solution

For speed, use an `XmlReader`:

using (StringReader sr = new StringReader(myString))
using (XmlReader xr = XmlReader.Create(sr))
{
    while (xr.Read())
    {
        if (xr.NodeType == XmlNodeType.Element && xr.Name == "foo")
        {
            Console.WriteLine(xr.ReadString());
        }
    }
}

The above prints out the text content of every element named "foo" in the XML document. (Well, sort of. `ReadString` doesn't handle nested elements very gracefully.)

Using an `XPathDocument` is slower, because the entire document gets parsed before you can start searching it, but it has the merit of simplicity:

using (StringReader sr = new StringReader(myString))
{
    XPathDocument d = new XPathDocument(sr);
    foreach (XPathNavigator n in d.CreateNavigator().Select("//foo/text()"))
    {
        Console.WriteLine(n.Value);
    }
}

If you're not concerned with performance or memory utilization, it's simplest to use an `XmlDocument`:

XmlDocument d = new XmlDocument();
d.LoadXml(myString);
foreach (XmlNode n in d.SelectNodes("//foo/text()"))
{
   Console.WriteLine(n.Value);
}

Problem

I have a string that contains well formed xml in it. I want to navigate the XML in that string to extract the text in certain nodes. How do I efficiently accomplish this using a built-in .NET class. Which .NET XML class would you use and why? Many thanks for your help. Note 1: Linq is not available to me. Note 2: Editing the XML is not important. Read-only access is what I need.

Original source