DIV CSS 佈局教程網

 DIV+CSS佈局教程網 >> 網頁腳本 >> XML學習教程 >> XML詳解 >> 使用XPathExpression類對XML進行排序
使用XPathExpression類對XML進行排序
編輯:XML詳解     

如果你曾經使用過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表達式來完成我們的排序功能。由於這個類是一個抽象類,我們不能這樣直接創建它:

XPathNavigator nav = new XPathNavigator();

我們必須使用XmlDocument、XMLDataDocument或XPathDocument的CreateNavigator()方法來創建:

XPathDocument doc = new XPathDocument(Server.MapPath("customers.XML")); XPathNavigator nav = doc.CreateNavigator();

創建了XPathNavigator對象後,我們就可以使用Compile()方法編譯一個XPath表達式,這個方法返回一個XPathExpression 類,它封裝編譯過的表達式,同時允許我們進行排序。下面是一個使用XPathNavigator類創建一個編譯過的XPath表達式的例子:

XPathExpression exp = nav.Compile(xpath);

我們通過使用XPathExpression對象的AddSort()方法實現排序的功能,這個方法有兩個重載的方式:

public abstract void AddSort(object expr, IComparer comparer); public abstract void AddSort( object expr, XmlSortOrder order, XmlCaseOrder caSEOrder, string lang, XMLDataType dataType );

第一個方法允許我們使用自定義的排序表達式;第二個方法有5個參數:分別是要排序的對象、排序順序、條件順序、語言類別和數據類型,下面就是使用該方法進行排序的例子:

exp.AddSort("text()",XmlSortOrder.Ascending,XmlCaSEOrder.None,"",XMLDataType.Text);

一旦我們對XPath表達式添加了排序的功能,我們就可以調用XPathNavigator對象的Select()方法,並把編譯過的XPath表達式作為參數,Select()方法返回一個XPathNodeIterator對象,我們可以使用它遍歷我們所選擇的節點。

下面就是用C#編寫的實現排序功能的所有代碼:

private void Page_Load(object sender, System.EventArgs e) { StringBuilder unsorted = new StringBuilder(); StringBuilder sorted = new StringBuilder(); string xpath = "/Customers/Customer/ContactName"; XPathDocument doc = new XPathDocument(Server.MapPath("customers.XML")); XPathNavigator nav = doc.CreateNavigator(); XPathNodeIterator nodeIter1 = nav.Select(xpath); while (nodeIter1.MoveNext()) { unsorted.Append(nodeIter1.Current.Value + "<br />"); } this.lblUnsorted.Text = unsorted.ToString(); XPathExpression exp = nav.Compile(xpath); exp.AddSort("text()",XmlSortOrder.Ascending, XmlCaSEOrder.None,"",XMLDataType.Text); XPathNodeIterator nodeIter2 = nav.Select(exp); while (nodeIter2.MoveNext()) { sorted.Append(nodeIter2.Current.Value + "<br />"); } this.lblSorted.Text = sorted.ToString(); }

XML學習教程| jQuery入門知識| AJAX入門| Dreamweaver教程| Fireworks入門知識| SEO技巧| SEO優化集錦|
Copyright © DIV+CSS佈局教程網 All Rights Reserved