使用XPathExpression类对XML进行排序
2009-06-23 22:35
162 查看
如果你曾经使用过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()方法实现排序的功能,这个方法有两个重载的方式:
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();
}
在.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()方法实现排序的功能,这个方法有两个重载的方式:
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();
}
相关文章推荐
- 使用XPathExpression类对XML进行排序
- 使用XPathExpression类对XML进行排序
- 使用XPathExpression类对XML进行排序
- 使用 xsl 对 xml 文档进行动态排序,分页显示的扩展
- 使用XPathExpression类对XML进行排序
- 使用XPathExpression类对XML进行排序
- 使用Hadoop进行大规模数据的全局排序
- JAVA中Arrays.sort()使用两种方式(Comparable和Comparator接口)对对象或者引用进行排序
- 2017-06-21 在web.xml中使用UrlRewriteFilter来对url进行重写
- Arrays.sort()使用两种方式(Comparable和Comparator接口)对对象或者引用进行排序
- linux 下 rpc python 实例之使用XML-RPC进行远程文件共享
- 使用TinyXML进行xml文件解析,生成xml文件
- 在Ruby中使用冒泡法进行排序
- xml简单介绍及使用dom4j进行解析
- 使用BitSet对1000万个Int整数进行排序
- PHP 使用用户自定义的比较函数对数组中的值进行排序
- 使用Tinyxml2进行简单的xml操作
- 如何用XSL对XML的数据进行按节点排序?
- qsort 使用快速排序例程进行排序
- java中使用sort()对ArrayList进行排序