Navigating a Non-XML Document with XPath
One of the most
interesting and unique aspects of .NET’s XML
implementation is the fact that you can read non-XML data as if it
were XML by creating subclasses of its abstract types. You saw this
already in XmlReader and
XmlWriter.
Because
you can read an XmlDocument from any
XmlReader, it follows that you can call that
XmlDocument’s
SelectSingleNode( ) and CreateNavigator(
) methods to navigate the document via XPath. You can also
create an XPathDocument from any
XmlReader, and use its CreateNavigator(
) method. In addition to that, however, you can also create
a custom implementation of XPathNavigator to
navigate any source document with XPath.
Using a custom XmlReader
You’ve already
created and used XmlPyxReader in Chapter 4. Since XmlPyxReader is just
like any other instance of XmlReader, you can pass
it to XPathDocument’s constructor
and navigate it using XPath:
XmlReader reader = new XmlPyxReader(filename); XPathDocument document = new XPathDocument(reader); XPathNavigator navigator = document.CreateNavigator( ); XPathNodeIterator iterator = navigator.Select(xpathExpression); Console.WriteLine("{0} nodes matched.", iterator.Count); while (iterator.MoveNext( )) { Console.WriteLine(iterator.Current.LocalName); } writer.Close( );
Using a custom XPathNavigator
The
next possibility is to skip over the custom
XmlReader and go directly to a custom
XPathNavigator. Like custom
XmlReaders, custom
XPathNavigators have numerous methods ...