使用XPathExpression类对XML进行排序

express|xml|排序

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

时间: 2024-10-29 08:24:27

使用XPathExpression类对XML进行排序的相关文章

XPathExpression类对XML进行排序

xpathexpression类对xml进行排序 在.net平台下,要完成这样的工作非常轻松,我们只需使用system.xml.xpath名字空间里的几个类即可,如 xpathnavigator和xpathexpression.这些类相当于xslt中xpath的功能,允许你在xml文档中进行遍历,也可以进行排 序的操作.下面是对system.xml.xpath名字空间中的类进行的简单的描述: 由于要详细讨论每一个类的细节,超出了我们主题的范围,我们只讨论与排序有关的那些类的使用.首先,我们需要创

用XMLTextReader类加速XML存取

xml 在.NET框架的System.XML名称空间中包含的XMLTextReader类不需要对系统资源要求很高,就能从XML文件中快速读取数据.使用XMLTextReader类能够从XML文件中读取数据,并且将其转换为HTML格式在浏览器中输出. 读本文之前,读者需要了解一些基本知识:XML.HTML.C#编程语言,以及.NET尤其是ASP.NET框架的一些知识. 微软公司的.NET框架为开发者提供了许多开发的便利,随着XML的重要性不断增长,开发者们都期待着有一整套功能强大的XML工具被开发

简单实体类和xml文件的相互转换方法

最近写一个题目,要求将一组员工实体类转换成xml文件,或将xml文件转换成一组实体类.题目不难,但写完感觉可以利用泛型和反射将任意一个实体类和xml文件进行转换.于是今天下午立马动手 试了下,做了个简单的模型,可以将简单的实体类和xml文件进行相互转换,但对实体类的属性类型有限制,目前只支持String, Integer, Double三种类型.但是后面可以扩展. 我的大概思路是这样的,只要能拿到实体类的类型信息,我就能拿到实体类的全部字段名称和类型,拼属性的set和get方法更是简单明了,这时

php中使用DOM类读取XML文件的实现代码_php技巧

主要功能:php中使用DOM类读取XML文件 设计知识点: 1.XML节点循环读取 2.用iconv()函数实现编码转换,防止中文乱码 holiday.xml文件如下 复制代码 代码如下: <?xml version="1.0" encoding="UTF-8"?> <daysOff-overTime> <year> <yearName>2012</yearName> <holiday> <

今天看到一个很好的类-操作xml的!贴出来给大家,不知道以前贴过没有?

xml <?/*     (c) 2000 Hans Anderson Corporation.  All Rights Reserved.     You are free to use and modify this class under the same     guidelines found in the PHP License.     -----------     bugs/me:     http://www.hansanderson.com/php/     me@hans

php类:XML文件分析类

XMLParser.class.php <?php /** XML 文件分析类 * Date: 2013-02-01 * Author: fdipzone * Ver: 1.0 * * func: * loadXmlFile($xmlfile) 读入xml文件输出Array * loadXmlString($xmlstring) 读入xmlstring 输出Array */ class XMLParser{ /** 读取xml文件 * @param String $xmlfile * @retu

常见的五类排序算法图解和实现(选择类:简单选择排序,锦标赛排序,树形选择排序,堆排序)

选择类的排序算法 简单选择排序算法 采用最简单的选择方式,从头到尾扫描待排序列,找一个最小的记录(递增排序),和第一个记录交换位置,再从剩下的记录中继续反复这个过程,直到全部有序. 具体过程: 首先通过 n –1 次关键字比较,从 n 个记录中找出关键字最小的记录,将它与第一个记录交换. 再通过 n –2 次比较,从剩余的 n –1 个记录中找出关键字次小的记录,将它与第二个记录交换. 重复上述操作,共进行 n –1 趟排序后,排序结束. 如图   过程图解 令 k=i:j = i + 1: 目

An ASP Class for XML Data Transfer(vbs类生成xml文件),希望

有两文件:objXML.asp:测试文件clsXML.asp:vbs类文件代码:objXML.asp<%@ Language=VBScript %><% Option Explicit %><!--#INCLUDE FILE="clsXML.asp"--><%Dim objXML, strPath, strSet objXML = New clsXMLstrPath = Server.MapPath(".") & &

C#中如何将一个类用XML序列化后,作为一个节点添加到已存在的xml文件中

问题描述 比如有个Cat类,实例化后,要以xml的格式序列化保存到本地的CatList.xml中,不能覆盖xml文件中原有的数据,只是作为一个新的节点加入.如果加入成功,要以反序列化的方式读取,怎么操作谢谢各位 解决方案 解决方案二:Serialize对象后appendChild或者insertBefore到新的节点,再Deserialize对象读取.解决方案三:建议lz看看如何使用linq操作xml文件.这个不难.解决方案四:其实大家的想法我也知道,现实遇到的问题是,序列化和反序列化操作的是流