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.