如果你曾經使用過XSLT,當你需要對XML文檔中的字符串或數字進行排序時,你可能會習慣於使用xsl:sort元素,在進行xsl:for-each進行循環或用xsl:apply-templates調用模板時,這個元素的功能很方便,而且簡單。然而,在某些情況下,你只是想簡單對XML文檔進行簡單的排序和顯示數據,那麼xsl:sort就會大大降低計算機性能,下面就解釋一下,如何在不使用xsl:sort元素的情況下,實現對XML數據進行排序。
在.Net平台下,要完成這樣的工作非常輕松,我們只需使用System.Xml.XPath名字空間裡的幾個類即可,如XPathNavigator和XPathExpression。這些類相當於XSLT中XPath的功能,允許你在XML文檔中進行遍歷,也可以進行排序的操作。下面是對System.XML.XPath名字空間中的類進行的簡單的描述:
XPathDocument:進行XML文檔處理時,提供一個快速、有效的、只讀的Cache功能,在進行XSLT轉換時,推薦使用該類。
XPathException:當處理XPath產生錯誤時,拋出一個例外。
XPathExpression:保存在調用XPathNavigator的Compile()方法時生成的、經過編譯的XPath表達式。
XPathNavigator:提供一個指針模型,供我們讀取支持IXPathNavigable接口的所保存的任何類型的數據。
XPathNodeIterator:遍歷節點集合。
由於要詳細討論每一個類的細節,超出了我們主題的范圍,我們只討論與排序有關的那些類的使用。首先,我們需要創建一個XPathNavigator對象,以便建立XPath表達式來完成我們的排序功能。由於這個類是一個抽象類,我們不能這樣直接創建它:
我們必須使用XmlDocument、XMLDataDocument或XPathDocument的CreateNavigator()方法來創建:
創建了XPathNavigator對象後,我們就可以使用Compile()方法編譯一個XPath表達式,這個方法返回一個XPathExpression 類,它封裝編譯過的表達式,同時允許我們進行排序。下面是一個使用XPathNavigator類創建一個編譯過的XPath表達式的例子:
我們通過使用XPathExpression對象的AddSort()方法實現排序的功能,這個方法有兩個重載的方式:
第一個方法允許我們使用自定義的排序表達式;第二個方法有5個參數:分別是要排序的對象、排序順序、條件順序、語言類別和數據類型,下面就是使用該方法進行排序的例子:
一旦我們對XPath表達式添加了排序的功能,我們就可以調用XPathNavigator對象的Select()方法,並把編譯過的XPath表達式作為參數,Select()方法返回一個XPathNodeIterator對象,我們可以使用它遍歷我們所選擇的節點。
下面就是用C#編寫的實現排序功能的所有代碼: