本分步指南介紹了如何用從 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\Microsoft
NET\FrameworkSDK\Samples\Quickstart\Howto\Samples\Xml\Transformxml\VB 必須將 Books
xml 復制到 \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 nodes
do {
} while (navMoveToNext());
使用 NodeType 屬性確保您只處理元素的節點使用 Value 屬性顯示元素的文本表示形式
do {
//Find the first element
if (navNodeType == XPathNodeTypeElement) {
//Determine whether children exist
if (navHasChildren == true) {
//Move to the first child
navMoveToFirstChild();
//Loop through all the children
do {
//Display the data
ConsoleWrite(The XML string for this child );
ConsoleWriteLine(is {} navValue);
} while (navMoveToNext());
}
}
} while (navMoveToNext());
使用 HasAttributes 屬性確定節點是否有任何屬性還可使用其他方法(如 MoveToNextAttribute)移至某個屬性並檢查它的值請注意該代碼段只遍歷根節點的子代而不是整個樹
do {
//Find the first element
if (navNodeType == XPathNodeTypeElement) {
//if children exist
if (navHasChildren == true) {
//Move to the first child
navMoveToFirstChild();
//Loop through all the children
do {
//Display the data
ConsoleWrite(The XML string for this child );
ConsoleWriteLine(is {} navValue);
//Check for attributes
if (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 element
if (navNodeType == XPathNodeTypeElement) {
//Determine whether children exist
if (navHasChildren == true) {
//Move to the first child
navMoveToFirstChild();
//Loop through all of the children
do {
//Display the data
ConsoleWrite(The XML string for this child );
ConsoleWriteLine(is {} navValue);
//Check for attributes
if (navHasAttributes == true) {
ConsoleWriteLine(This node has attributes);
}
} while (navMoveToNext());
}
}
} while (navMoveToNext());
//Pause
ConsoleReadLine();
}
}
}
疑難解答
在測試代碼時
您可能會收到以下異常錯誤信息
An unhandled exception of type
System
Xml
XmlException
occurred in system
xml
dll
Additional information:System error
該異常錯誤發生在以下代碼行上
docNav = new XPathDocument(c:\\booksxml);
該異常錯誤是由無效的處理指令導致的
例如
處理指令可能包含多余的空格
下面是無效處理指令的示例
若要解決該異常
請執行以下操作之一
糾正無效的處理指令
下面是有效處理指令的示例
或
下面是有效處理指令的示例
從 Books
xml 文件中刪除 XML 處理指令
From:http://tw.wingwit.com/Article/program/net/201311/11778.html