XPathExpression类对XML进行排序

xpathexpression类对xml进行排序

在.net平台下,要完成这样的工作非常轻松,我们只需使用system.xml.xpath名字空间里的几个类即可,如 xpathnavigator和xpathexpression。这些类相当于xslt中xpath的功能,允许你在xml文档中进行遍历,也可以进行排 序的操作。下面是对system.xml.xpath名字空间中的类进行的简单的描述:

由于要详细讨论每一个类的细节,超出了我们主题的范围,我们只讨论与排序有关的那些类的使用。首先,我们需要创建一个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,
     xmlcaseo教程rder 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();
 }

xpathdocument:进行xml文档处理时,提供一个快速、有效的、只读的cache功能,在进行xslt转换时,推荐使用该类。

xpathexception:当处理xpath产生错误时,抛出一个例外。

xpathexpression:保存在调用xpathnavigator的compile()方法时生成的、经过编译的xpath表达式。

xpathnavigator:提供一个指针模型,供我们读取支持ixpathnavigable接口的所保存的任何类型的数据。

xpathnodeiterator:遍历节点集合。

时间: 2024-12-01 09:34:36

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

使用XPathExpression类对XML进行排序

express|xml|排序 如果你曾经使用过XSLT,当你需要对XML文档中的字符串或数字进行排序时,你可能会习惯于使用xsl:sort元素,在进行xsl:for-each进行循环或用xsl:apply-templates调用模板时,这个元素的功能很方便,而且简单.然而,在某些情况下,你只是想简单对XML文档进行简单的排序和显示数据,那么xsl:sort就会大大降低计算机性能,下面就解释一下,如何在不使用xsl:sort元素的情况下,实现对XML数据进行排序. 在.NET平台下,要完成这样的工

用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文件.这个不难.解决方案四:其实大家的想法我也知道,现实遇到的问题是,序列化和反序列化操作的是流