XML文檔可能包含1~1000個或者更多的元素。你可能需要訪問XML文檔包含的全部數據,或者訪問這些數據的一個選定的子集。XPath提供了定位和選擇XML子集的語法,從而簡化了這一任務。.Net框架使用XPathNavigator類來執行XPath命令,但要想利用它,必須有一個可用的XML文檔。
可用.Net XPathDocument類來處理一個XML文檔的創建或檢索。這個類提供了大量方法和屬性,但我們重點關注的是CreateNavigator方法。該方法創建一個和XML文檔對應的XPathNavigator對象。在本文的例子中,將使用下面這個基本的XML文檔:
<?XML version="1.0" encoding="utf-8" ?>
<sites>
<website>
<name type="Application Development">Builder.com</name>
<link>www.builder.com</link>
</website>
<website>
<name type="Information Technology">TechRepublic</name>
<link>www.techrepublic.com</link>
</website>
<website>
<name type="Technology News">News.com</name>
<link>www.news.com</link>
</website>
</sites>
假定上述XML存儲在一個本地文件中,例如C:\builder.XML,你可用以下VB.Net代碼為其指派一個XPathNavigator對象:
Dim xpathDoc As XPathDocument
Dim XMLNav As XPathNavigator
Try
xpathDoc = New XPathDocument("c:\builder.XML")
xmlNav = XMLDoc.CreateNavigator()
Catch ex As XPathException
System.Console.WriteLine("XMLException: " + ex.Message)
Catch ex As Exception
System.Console.WriteLine("Exception: " + ex.Message)
End Try
注意,用於訪問XML文檔的代碼封閉在一個try/catch塊中,以便處理可能發生的任何運行時異常。另外要注意,你需要包括以下命名空間,以便在自己的代碼中利用XML類:
imports System.XML.XPath
該命名空間允許你直接使用需要的類,而不必包括完全限定名稱。除了迄今為止用到的類之外,在處理XML數據時還要用到XPathNodeIterator和XPathExpression類。
XPathNodeIterator類包括以下用於遍歷XML文檔的方法:
以下示范代碼展示了如何運用這些方法:
Dim xpathDoc As XPathDocument
Dim XMLNav As XPathNavigator
Dim XMLNI As XPathNodeIterator
xpathDoc = New XPathDocument("c:\builder.XML")
XMLNav = xpathDoc.CreateNavigator()
xmlNI = XMLNav.Select("/sites/website")
While (XMLNI.MoveNext())
System.Console.WriteLine(xmlNI.Current.Name + " : " + XMLNI.Current.Value)
End While
上述代碼遍歷由XPath表達式(例如/sites/website)返回的所有節點。表達式返回所有website節點,並將sites節點當作父節點(也就是根節點)。MoveNext方法可由XPathNodeIterator基類使用,但前面列出的其他方法要求一個節點作為起點。當前節點是用XPathNodeIterator類的Current屬性來訪問的。
以下示范代碼對上例進行了擴展,它使用MovePrevious方法在初始循環之後反向遍歷節點列表:
Dim xpathDoc As XPathDocument
Dim XMLNav As XPathNavigator
Dim XMLNI As XPathNodeIterator
xpathDoc = New XPathDocument("c:\builder.XML")
XMLNav = xpathDoc.CreateNavigator()
xmlNI = XMLNav.Select("/sites/website")
While (XMLNI.MoveNext())
System.Console.WriteLine(xmlNI.Current.Name + " : " + XMLNI.Current.Value)
End While
Do
System.Console.WriteLine(xmlNI.Current.Name + " : " + XMLNI.Current.Value)
Loop While (XMLNI.Current.MoveToPrevious())
可用其他方法在搜索結果中遍歷。除此之外,可利用大量屬性來確定一個節點的特征。下面進行了簡要總結:
以下代碼利用上述2個屬性來確定節點的特征:
While (XMLNI.MoveNext())
If Not (XMLNI.Current.IsEmptyElement) Then
System.Console.WriteLine(xmlNI.Current.Name + " : " + XMLNI.Current.Value)
End If
If Not (XMLNI.Current.HasAttribute) Then
// work with attributes
End If
End While
當然,使用XPath可以輕松地操縱節點。以下表達式將返回具有特定Attribute值的節點:
/sites/website[@Type="Technology News"]
XPath規范簡化了XML文檔導航,本文的例子證明它極易上手。