如
果你曾經使用過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();
?}
凡是有該標志的文章,都是該blog博主Caoer(草兒)原創,凡是索引、收藏
、轉載請注明來處和原文作者。非常感謝。