使用XPathExpression类对XML进行排序

原创 2002年07月29日 09:04:00

使用XPathExpression类对XML进行排序

net_lover

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

 

使用XPathExpression类对XML进行排序

使用XPathExpression类对XML进行排序net_lover 如果你曾经使用过XSLT,当你需要对XML文档中的字符串或数字进行排序时,你可能会习惯于使用xsl:sort元素,在进行xs...
  • hejishan
  • hejishan
  • 2008年03月11日 12:20
  • 273

使用XPathExpression类对XML进行排序

 如果你曾经使用过XSLT,当你需要对XML文档中的字符串或数字进行排序时,你可能会习惯于使用xsl:sort元素,在进行xsl:for-each 进行循环或用xsl:apply-templates调...
  • xzr2004
  • xzr2004
  • 2007年08月10日 22:46
  • 535

使用XPathExpression类对XML进行排序

如果你曾经使用过XSLT,当你需要对XML文档中的字符串或数字进行排序时,你可能会习惯于使用xsl:sort元素,在进行xsl:for-each进行循环或用xsl:apply-templates调用模...
  • jxufewbt
  • jxufewbt
  • 2007年08月08日 17:24
  • 617

XPathExpression类对XML进行排序

XPathExpression类对XML进行排序XPathExpression类对XML进行排序2008-11-11  如果你曾经使用过XSLT,当你需要对XML文档中的字符串或数字进行排序时,你可能...
  • tourstar
  • tourstar
  • 2010年09月08日 15:07
  • 452

学习XML与XSLT:排序

动机: 排序功能让我们页面上的数据显的更人性化,是我们在网站上见过的很普遍的一个功能效果了。以往的自动排序都是用大量的脚本代码来完成的,对一般的爱好者来说这是件困难的事情。然而用XML来处理的话就简单...
  • chaoyanglee163
  • chaoyanglee163
  • 2005年07月07日 17:06
  • 2215

如何使用Arrays.sort()对自己定义的类进行排序

首先你要定义自己的类,该类必须继承自Comparable抽闲接口,因为调用sort排序的对象必须是可以比较的,通过重载Comparable接口的compareTo函数定义自己的比较规则,下面是我定义的...
  • WitsMakeMen
  • WitsMakeMen
  • 2013年05月06日 09:31
  • 4478

C++对类或结构体进行指定规则排序

STL中就自带了排序函数sortsort 对给定区间所有元素进行排序.使用#include sort即可使用,语法描述为:sort(begin,end,cmp),表示一个范围。其中cmp是自己指定的...
  • xyisv
  • xyisv
  • 2017年12月03日 17:51
  • 100

利用冒泡排序对数组进行排序

一、冒泡排序:        利用冒泡排序对数组进行排序 二、基本概念:        依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数...
  • pplsunny
  • pplsunny
  • 2013年08月04日 11:02
  • 1531

根据类中的某个属性对类进行排序

有时候,我们会有这样的需求:通过制定的类中的元素,对多个实例对象进行排列显示。 那么,今天我为大家写了这样一个类,以便使用 话不多说,贴上源码 public class ListSortE>...
  • leiliang568
  • leiliang568
  • 2016年01月08日 12:13
  • 225

对自定义对象进行排序(C++/Java)

自定义了对象,如何按照自定对象中某一或多个元素对其进行排序呢?以下分别从C++和java对其进行实现。 一:C++ /* 实现对自定义的对象类型进行排序(按照其中的元素),首先将对象存放在ve...
  • Lu597203933
  • Lu597203933
  • 2014年12月06日 17:08
  • 2568
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用XPathExpression类对XML进行排序
举报原因:
原因补充:

(最多只允许输入30个字)