本分步指南介绍了如何用从 XPathDocument 对象创建的 XPathNavigator 对象浏览可扩展标记语言 (XML) 文档
本示例用 XML 数据加载 XpathDocument 对象
针对该数据创建一个作为视图的 XPathNavigator 对象
并通过遍历该文档显示 XML
要求
下面的列表列出了推荐使用的硬件
软件
网络基础结构以及所需的服务包
; Microsoft Visual C# NET
本文假定您熟悉下列主题
;XML 术语
;创建和读取 XML 文件
;XML 路径语言 (XPath) 语法
如何使用 XPathNavigator 类浏览 XML
在 Visual Studio NET 中新建一个 Visual C# NET 控制台应用程序
备注本示例使用名为 Booksxml 的文件您可以创建自己的 Booksxml 文件也可以使用 NET 软件开发工具包 (SDK) 快速入门中包括的示例如果您没有安装快速入门而且也不想安装它们请参阅 Booksxml 下载位置的参考部分如果已经安装快速入门则 Booksxml 位于以下文件夹中
\Program Files\MicrosoftNET\FrameworkSDK\Samples\Quickstart\Howto\Samples\Xml\Transformxml\VB 必须将 Booksxml 复制到 \Bin\Debug 文件夹该文件夹位于您在其中创建此项目的文件夹中
确保该项目引用 SystemXml 名称空间
在 Xml 和 XPath 名称空间上使用 using 语句这样以后就不需要在代码中限定这些名称空间中的声明了using 语句必须在所有其他声明之前使用如下所示
using SystemXml; using SystemXmlXPath;
声明合适的变量声明 XPathDocument 对象以保存 XML 文档并声明 XPathNavigator 对象以计算 XPath 表达式并遍历该文档声明 String 对象以保存 XPath 表达式在 Module 的 Main 过程中添加声明代码
XPathNavigator nav; XPathDocument docNav;
用示例文件 Booksxml 加载 XPathDocument 对象xpathdocument 类使用可扩展样式表语言转换 (XSLT) 为 XML 文档处理提供快速和面向性能的缓存它类似于 XML 文档对象模型 (DOM)但经过了高度优化以用于 XSLT 处理和 XPath 数据模型
// Open the XML docNav = new XPathDocument(@c:\booksxml);
从文档创建 XPathNavigator 对象xpathnavigator 使您能够在 XML 文档中遍历属性节点和名称空间节点
// Create a navigator to query with XPath nav = docNavCreateNavigator();
使用 MoveToRoot 方法移至文档的根movetoroot 将浏览器放到包含整个节点树的文档节点
//Initial XPathNavigator to start at the root navMoveToRoot();
使用 MoveToFirstChild 方法移至 XML 文档的子级movetofirstchild 方法移至当前节点的第一个子级对于 Booksxml 的源是从根文档移至子文档注释部分和 Bookstore 节点
//Move to the first child node (comment field) navMoveToFirstChild();
使用 MoveToNext 方法迭代通过同一层次上的节点使用 MoveToNext 方法移至当前节点下一层次的节点
//Loop through all of the root nodesdo { } while (navMoveToNext());
使用 NodeType 属性确保您只处理元素的节点使用 Value 属性显示元素的文本表示形式
do {//Find the first elementif (navNodeType == XPathNodeTypeElement) {//Determine whether children existif (navHasChildren == true) {//Move to the first childnavMoveToFirstChild();//Loop through all the childrendo {//Display the dataConsoleWrite(The XML string for this child );ConsoleWriteLine(is {} navValue); } while (navMoveToNext()); } } } while (navMoveToNext());
使用 HasAttributes 属性确定节点是否有任何属性还可使用其他方法(如 MoveToNextAttribute)移至某个属性并检查它的值请注意该代码段只遍历根节点的子代而不是整个树
do {//Find the first elementif (navNodeType == XPathNodeTypeElement) {//if children existif (navHasChildren == true) {//Move to the first childnavMoveToFirstChild();//Loop through all the childrendo {//Display the dataConsoleWrite(The XML string for this child );ConsoleWriteLine(is {} navValue);//Check for attributesif (navHasAttributes == true) {ConsoleWriteLine(This node has attributes); } } while (navMoveToNext()); } } } while (navMoveToNext());
使用 Console 对象的 ReadLine 方法在控制台显示的末尾添加 pause以便更容易地显示上述结果
//Pause ConsoleReadLine();
生成并运行 Visual C#NET 项目
完整代码列表
using System;using SystemXml;using SystemXmlXPath;namespace q {class Class {static void Main(string[] args){XPathNavigator nav; XPathDocument docNav; docNav = new XPathDocument(@c:\booksxml);nav = docNavCreateNavigator();navMoveToRoot();//Move to the first child node (comment field)navMoveToFirstChild();do { //Find the first elementif (navNodeType == XPathNodeTypeElement) {//Determine whether children existif (navHasChildren == true) {//Move to the first childnavMoveToFirstChild();//Loop through all of the childrendo {//Display the dataConsoleWrite(The XML string for this child );ConsoleWriteLine(is {} navValue);//Check for attributesif (navHasAttributes == true) {ConsoleWriteLine(This node has attributes); } } while (navMoveToNext()); } } } while (navMoveToNext()); //PauseConsoleReadLine(); } }}
疑难解答
在测试代码时
您可能会收到以下异常错误信息
An unhandled exception of type SystemXmlXmlException occurred in systemxmldll
Additional information:System error该异常错误发生在以下代码行上
docNav = new XPathDocument(c:\\booksxml);
该异常错误是由无效的处理指令导致的
例如
处理指令可能包含多余的空格
下面是无效处理指令的示例
若要解决该异常
请执行以下操作之一
纠正无效的处理指令下面是有效处理指令的示例
或
下面是有效处理指令的示例从 Booksxml 文件中删除 XML 处理指令