如果你曾經使用過XSLT當你需要對XML文檔中的字符串或數字進行排序時你可能會習慣於使用xsl:sort元素在進行xsl:foreach進行循環或用xsl:applytemplates調用模板時這個元素的功能很方便而且簡單然而在某些情況下你只是想簡單對XML文檔進行簡單的排序和顯示數據那麼xsl:sort就會大大降低計算機性能下面就解釋一下如何在不使用xsl:sort元素的情況下實現對XML數據進行排序
在net平台下要完成這樣的工作非常輕松我們只需使用SystemXmlXPath名字空間裡的幾個類即可如XPathNavigator和XPathExpression這些類相當於XSLT中XPath的功能允許你在XML文檔中進行遍歷也可以進行排序的操作下面是對SystemXmlXPath名字空間中的類進行的簡單的描述
XPathDocument進行XML文檔處理時提供一個快速有效的只讀的Cache功能在進行XSLT轉換時推薦使用該類
XPathException當處理XPath產生錯誤時拋出一個例外
XPathExpression保存在調用XPathNavigator的Compile()方法時生成的經過編譯的XPath表達式
XPathNavigator提供一個指針模型供我們讀取支持IXPathNavigable接口的所保存的任何類型的數據
XPathNodeIterator遍歷節點集合
由於要詳細討論每一個類的細節超出了我們主題的范圍我們只討論與排序有關的那些類的使用首先我們需要創建一個XPathNavigator對象以便建立XPath表達式來完成我們的排序功能由於這個類是一個抽象類我們不能這樣直接創建它
XPathNavigator nav = new XPathNavigator();
我們必須使用XmlDocumentXmlDataDocument或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
);
第一個方法允許我們使用自定義的排序表達式第二個方法有個參數分別是要排序的對象排序順序條件順序語言類別和數據類型下面就是使用該方法進行排序的例子
expAddSort(text()XmlSortOrderAscendingXmlCaseOrderNoneXmlDataTypeText);
一旦我們對XPath表達式添加了排序的功能
我們就可以調用XPathNavigator對象的Select()方法並把編譯過的XPath表達式作為參數Select()方法返回一個XPathNodeIterator對象我們可以使用它遍歷我們所選擇的節點
下面就是用C#編寫的實現排序功能的所有代碼
private void Page_Load(object sender SystemEventArgs e) {
StringBuilder unsorted = new StringBuilder();
StringBuilder sorted = new StringBuilder();
string xpath = /Customers/Customer/ContactName;
XPathDocument doc = new XPathDocument(ServerMapPath(customersxml));
XPathNavigator nav = docCreateNavigator();
XPathNodeIterator nodeIter = navSelect(xpath);
while (nodeIterMoveNext()) {
unsortedAppend(nodeIterCurrentValue + <br />);
}
thislblUnsortedText = unsortedToString();
XPathExpression exp = navCompile(xpath);
expAddSort(text()XmlSortOrderAscending
XmlCaseOrderNoneXmlDataTypeText);
XPathNodeIterator nodeIter = navSelect(exp);
while (nodeIterMoveNext()) {
sortedAppend(nodeIterCurrentValue + <br />);
}
thislblSortedText = sortedToString();
}
From:http://tw.wingwit.com/Article/program/net/201311/14501.html