SUMMARY
This step-by-step article describes how to navigate Extensible Markup Language (XML) documents with an
XPathNavigator object that is created from an
XPathDocument object. This sample loads an
XPathDocument object with XML data, creates an
XPathNavigator object as a view onto the data, and displays the XML by walking through the document.
back to the top
Requirements
The following list outlines the recommended hardware, software, network infrastructure, and service packs that you need:
- Microsoft Visual C# .NET or Microsoft Visual C# 2005
This article assumes that you are familiar with the following topics:
- XML terminology
- Creating and reading an XML file
- XML Path Language (XPath) syntax
back to the top
How to Use the XPathNavigator Class to Navigate XML
- Create a new Visual C# Console Application in Visual Studio. NET or Microsoft Visual Studio 2005.
NOTE: This example uses a file named Books.xml. You can create your own Books.xml file, or you can use the sample that is included with the .NET Software Development Kit (SDK) Quickstarts. If you do not have the Quickstarts installed and do not want to install them, see the "References" section for the Books.xml download location. If you have the Quickstarts installed, Books.xml is located in the following folder:
\Program Files\Microsoft.NET\FrameworkSDK\Samples\Quickstart\Howto\Samples\Xml\Transformxml\VB
You must copy Books.xml to the \Bin\Debug folder that is located under the folder in which you created this project. - Make sure that the project references the System.Xml namespace.
- Use the using statement on the Xml and XPath namespaces so that you are not required to qualify declarations in those namespaces later in your code. You must use the using statement prior to any other declarations, as follows:
using System.Xml;
using System.Xml.XPath;
- Declare the appropriate variables. Declare an XPathDocument object to hold the XML document and an XPathNavigator object to evaluate XPath expressions and move through the document. Declare a String object to hold the XPath expression. Add the declaration code in the Main procedure in Module1.
XPathNavigator nav;
XPathDocument docNav;
- Load an XPathDocument object with the sample file Books.xml. The XPathDocument class uses Extensible Stylesheet Language Transformations (XSLT) to provide a fast and performance-oriented cache for XML document processing. It is similar to the XML Document Object Model (DOM) but is highly optimized for XSLT processing and the XPath data model.
// Open the XML.
docNav = new XPathDocument(@"c:\books.xml");
- Create an XPathNavigator object from the document.
XPathNavigator enables you to move through both the attributes nodes and the namespace nodes in an XML document.
// Create a navigator to query with XPath.
nav = docNav.CreateNavigator();
- Move to the root of the document with the MoveToRoot method. MoveToRoot sets the navigator to the document node that contains the entire tree of nodes.
//Initial XPathNavigator to start at the root.
nav.MoveToRoot();
- Use the MoveToFirstChild method to move to the children of the XML document. The MoveToFirstChild method moves to the first child of the current node. In the case of the Books.xml source, you are moving away from the root document into the children, the Comment section, and the Bookstore node.
//Move to the first child node (comment field).
nav.MoveToFirstChild();
- Use the MoveToNext method to iterate through nodes at the sibling level. The MoveToNext method moves to the next sibling of the current node.
//Loop through all of the root nodes.
do {
} while (nav.MoveToNext());
- Use the NodeType property to make sure that you are only processing element nodes, and use the Value property to display the text representation of the element.
do {
//Find the first element.
if (nav.NodeType == XPathNodeType.Element) {
//Determine whether children exist.
if (nav.HasChildren == true) {
//Move to the first child.
nav.MoveToFirstChild();
//Loop through all the children.
do {
//Display the data.
Console.Write("The XML string for this child ");
Console.WriteLine("is '{0}'", nav.Value);
} while (nav.MoveToNext());
}
}
} while (nav.MoveToNext());
- Use the HasAttributes property to determine whether a node has any attributes. You can also use other methods, such as MoveToNextAttribute, to move to an attribute and inspect its value. Note that this code segment only walks through the descendents of the root node and not the entire tree.
do {
//Find the first element.
if (nav.NodeType == XPathNodeType.Element) {
//if children exist
if (nav.HasChildren == true) {
//Move to the first child.
nav.MoveToFirstChild();
//Loop through all the children.
do {
//Display the data.
Console.Write("The XML string for this child ");
Console.WriteLine("is '{0}'", nav.Value);
//Check for attributes.
if (nav.HasAttributes == true) {
Console.WriteLine("This node has attributes");
}
} while (nav.MoveToNext());
}
}
} while (nav.MoveToNext());
- Use the ReadLine method of the Console object to add a pause at the end of the console display to more readily display the above results.
//Pause.
Console.ReadLine();
- Build and run the Visual C# project.
back to the topComplete Code Listing
using System;
using System.Xml;
using System.Xml.XPath;
namespace q308343 {
class Class1 {
static void Main(string[] args) {
XPathNavigator nav;
XPathDocument docNav;
docNav = new XPathDocument(@"c:\books.xml");
nav = docNav.CreateNavigator();
nav.MoveToRoot();
//Move to the first child node (comment field).
nav.MoveToFirstChild();
do {
//Find the first element.
if (nav.NodeType == XPathNodeType.Element) {
//Determine whether children exist.
if (nav.HasChildren == true) {
//Move to the first child.
nav.MoveToFirstChild();
//Loop through all of the children.
do {
//Display the data.
Console.Write("The XML string for this child ");
Console.WriteLine("is '{0}'", nav.Value);
//Check for attributes.
if (nav.HasAttributes == true) {
Console.WriteLine("This node has attributes");
}
} while (nav.MoveToNext());
}
}
} while (nav.MoveToNext());
//Pause.
Console.ReadLine();
}
}
}
back to the topTroubleshooting
When you test the code, you may receive the following exception error message:
An unhandled exception of type 'System.Xml.XmlException' occurred in system.xml.dll
Additional information: System error.
The exception error occurs on the following line of code:
docNav = new XPathDocument("c:\\books.xml");
The exception error is caused by an invalid processing instruction. For example, the processing instruction may contain extraneous spaces. The following is an example of an invalid processing instruction:
<?xml version='1.0' ?>
To resolve the exception, do either of the following:
- Correct the invalid processing instruction.
The following is an example of a valid processing instruction:
<?xml version='1.0'?>
-or-
- Remove the XML processing instruction from the Books.xml file.
back to the top