如果你曾经使用过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 = docCreateNavigator();
创建了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();
}