Question: 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.

Answer: 
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);
}

```
I would use [XmlDocument.Load()](http://msdn.microsoft.com/en-us/library/system.xml.xmldocument.load(VS.71).aspx) to get a DOM from the string. Then you can traverse it using the appropriate DOM methods or XPATH as needed.