对XML实现自定义、多字段排序

转载 2007年09月17日 11:35:00

对Xml排序,除了使用XSLT之外,还可以使用XPathExpression类,但这些类一般情况下只支持数字和字符串类型的数据类型排序。要实现按照自己的排序方法排序,需要自己进行定义。AddSort 方法使用户能够按对象的数据类型(而不是按字符串或数字)将对象排序。IComparer 对象提供了 Compare 方法的实现,该实现支持按用户定义的类进行排序。

下面的例子就是实现自定义排序,并且支持多字段排序的一个例子。首先定义一个自定义对象,设置排序规则,然后使用XPathExpression.AddSort (Object, IComparer)方法进行排序。

a.xml文件

<multistatus>
  
<response>
    
<objectGuid>{E4FCC019-CF62-4CA8-B9DA-184D19B62FBB}</objectGuid>
    
<href>/Portal/newpage/100063AF50C.vbs</href>
    
<displayname>100063AF50C.vbs</displayname>
    
<parentname>/Portal/newpage/</parentname>
    
<contentclass>urn:schemas-mengxianhui-cn:webpart</contentclass>
    
<getlastmodified>2004-11-05 09:13:58</getlastmodified>
    
<Title>新闻页面</Title>
    
<Author/>  
  
</response>
  
<response>
    
<objectGuid>{661E575E-92A7-485C-B6B6-123BCE8377FC}</objectGuid>
    
<href>/Documents/home/images/shijian.gif</href>
    
<displayname>shijian.gif</displayname>
    
<contentclass>urn:schemas-mengxianhui-cn:basedocument</contentclass>
    
<getlastmodified>2005-10-26 17:03:39</getlastmodified>
    
<createtime>9999-10-25 11:57:16</createtime>
    
<Title>shijian</Title>
    
<Author/>
    
<ItemOrder>2</ItemOrder>
  
</response>
    
<response>
    
<objectGuid>{661E575E-92A7-485C-B6B6-123BCE8377FC}</objectGuid>
    
<href>/Documents/home/images/shijian.gif</href>
    
<displayname>shijian.gif</displayname>
    
<contentclass>urn:schemas-mengxianhui-cn:basedocument</contentclass>
    
<getlastmodified>2005-10-26 17:03:39</getlastmodified>
    
<createtime>2000-10-25 11:57:16</createtime>
    
<Title>孟子</Title>
    
<Author/>
    
<ItemOrder>2</ItemOrder>
  
</response>
    
<response>
    
<objectGuid>{661E575E-92A7-485C-B6B6-123BCE8377FC}</objectGuid>
    
<href>/Documents/home/images/shijian.gif</href>
    
<displayname>shijian.gif</displayname>
    
<contentclass>urn:schemas-mengxianhui-cn:basedocument</contentclass>
    
<getlastmodified>2005-10-26 17:03:39</getlastmodified>
    
<createtime>2008-10-25 11:57:16</createtime>
    
<Title>孟宪会</Title>
    
<Author/>
    
<ItemOrder>2</ItemOrder>
  
</response>
  
<response>
    
<objectGuid>{C023513E-8877-4D63-8F11-5C1DB5CE6384}</objectGuid>
    
<href>/Documents/home/images/jiaoshizhijia.gif</href>
    
<displayname>jiaoshizhijia.gif</displayname>
    
<contentclass>urn:schemas-mengxianhui-cn:basedocument</contentclass>
    
<getlastmodified>2003-10-26 17:03:39</getlastmodified>
    
<createtime>2002-10-22 16:38:02</createtime>
    
<Title>jiaoshizhijia</Title>
    
<ItemOrder>9</ItemOrder>
  
</response>
  
<response>
    
<objectGuid>{836BF9A3-32AE-48A5-B2AC-7525B9CCCEB3}</objectGuid>
    
<href>/Documents/home/images/leftbg.gif</href>
    
<displayname>leftbg.gif</displayname>
    
<contentclass>urn:schemas-mengxianhui-cn:basedocument</contentclass>
    
<getlastmodified>2004-10-26 17:03:39</getlastmodified>
    
<createtime>2008-10-22 16:04:01</createtime>
    
<Title>leftbg</Title>
    
<ItemOrder>65</ItemOrder>
    
<Author/>
  
</response>
  
<response>
    
<objectGuid>{DECED835-84BC-4F15-860D-658AC14A51AE}</objectGuid>
    
<href>/Documents/home/images/zhuce.gif</href>
    
<displayname>zhuce.gif</displayname>
    
<contentclass>urn:schemas-mengxianhui-cn:basedocument</contentclass>    
    
<getlastmodified>2004-10-26 17:03:39</getlastmodified>
    
<createtime>2002-10-22 16:01:07</createtime>
    
<Title>zhuce</Title>
    
<Author/>
    
<ItemOrder>32</ItemOrder>
  
</response>
  
<response>
    
<objectGuid>{EF9B16D0-DB39-4034-B02A-B270C0436408}</objectGuid>
    
<href>/Documents/home/images/bbs.gif</href>
    
<displayname>bbs.gif</displayname>
    
<contentclass>urn:schemas-mengxianhui-cn:basedocument</contentclass>    
    
<getlastmodified>2004-10-26 17:03:39</getlastmodified>
    
<createtime>2005-10-22 16:01:03</createtime>
    
<Title>bbs</Title>
    
<Author/>
    
<ItemOrder>4</ItemOrder>
  
</response>
  
<response>
    
<objectGuid>{E105440A-1F58-41E4-A5A4-1194C09B8728}</objectGuid>
    
<href>/Documents/home/images/gonggao.gif</href>
    
<displayname>gonggao.gif</displayname>
    
<contentclass>urn:schemas-mengxianhui-cn:basedocument</contentclass>    
    
<getlastmodified>2004-10-26 17:03:39</getlastmodified>
    
<createtime>2003-10-22 15:59:38</createtime>
    
<Title>gonggao</Title>
    
<Author/>
    
<ItemOrder>12</ItemOrder>
  
</response>
</multistatus>

SortXml.aspx

<%@ Page Language="C#" %>
<script runat="server">
  
/// <summary>
  
/// 实现自定义排序的比较器,可按升序、降序排序
  
/// </summary>
  public class DateTimeSort : System.Collections.IComparer
  {
    
private SortType dataSortType;
    
public enum SortType { Asc, Desc };
    
int System.Collections.IComparer.Compare( Object x, Object y )
    {
      
if (dataSortType == SortType.Asc)
      {
        
return System.DateTime.Compare(System.Convert.ToDateTime(x), System.Convert.ToDateTime(y));
      }
      
else
      {
        
return System.DateTime.Compare(System.Convert.ToDateTime(y), System.Convert.ToDateTime(x));
      }
    }
    
    
public SortType DataSortType
    {
      
set { dataSortType = value; }     
    }
  }
  
  
protected void Page_Load( object sender, EventArgs e )
  {
    System.Xml.XPath.XPathDocument xpd 
= new System.Xml.XPath.XPathDocument(Server.MapPath("~/a.xml"));
    System.Xml.XPath.XPathNavigator xpn 
= xpd.CreateNavigator();
    System.Xml.XPath.XPathExpression xpe 
= xpn.Compile("/multistatus/response[position() > 1]/Title");
    
//设置排序字段和排序规则
    DateTimeSort dts1 = new DateTimeSort();
    dts1.DataSortType 
= DateTimeSort.SortType.Asc;
    xpe.AddSort(
"../getlastmodified", dts1);
    DateTimeSort dts2 
= new DateTimeSort();
    dts2.DataSortType 
= DateTimeSort.SortType.Desc;
    xpe.AddSort(
"../createtime", dts2);
    System.Xml.XPath.XPathNodeIterator nodeIter 
= xpn.Select(xpe);
    Response.Write(
"<table border='0' cellspacing='1' cellpadding='3' style='background:#EEE;width:360px;font-size:12px;'>");
    Response.Write(
"<tr style='background:#DDD'><td>第一排序字段</td><td>第二排序字段</td><td>标题</td></tr>");
    
while (nodeIter.MoveNext())
    {
      Response.Write(
"<tr style='background:#FFF'><td>" + nodeIter.Current.SelectSingleNode("../getlastmodified").Value + "</td><td>" + nodeIter.Current.SelectSingleNode("../createtime").Value + "</td><td>" + nodeIter.Current.Value + "</td></tr>");
    }
    Response.Write(
"</table>");
  }
</script>

在使用 AddSort 方法时需要考虑的重要说明:

  1. 添加排序的顺序提供排序关键字的使用顺序。
  2. 如果 XPathExpression 或排序关键字需要命名空间解析,则必须使用 SetContext 方法为命名空间解析提供 XmlNamespaceManager。
  3. 在调用 SetContext 方法时,所有排序规则都被删除。若要保留排序规则,请在调用 AddSort 方法前调用 SetContext 方法。
  4. 如果 XPathExpression 不包含前缀,则认为命名空间 URI(统一资源标识符)为空命名空间。如果您的 XML 中包含默认命名空间,则仍须使用 SetContext 方法,并提供包含前缀和命名空间 URI 的 XmlNamespaceManager 以处理默认命名空间。
     

对XML实现自定义、多字段排序

对Xml排序,除了使用XSLT之外,还可以使用XPathExpression类,但这些类一般情况下只支持数字和字符串类型的数据类型排序。要实现按照自己的排序方法排序,需要自己进行定义。AddSor...
  • hejishan
  • hejishan
  • 2008年03月11日 11:45
  • 259

对XML实现自定义、多字段排序

对Xml排序,除了使用XSLT之外,还可以使用XPathExpression类,但这些类一般情况下只支持数字和字符串类型的数据类型排序。要实现按照自己的排序方法排序,需要自己进行定义。AddSort ...
  • net_lover
  • net_lover
  • 2007年09月13日 17:17
  • 6017

java 多字段排序

自定义工具类 package htmlToPdf; import java.lang.reflect.Field; import java.text.NumberFormat; import...
  • liuao107329
  • liuao107329
  • 2017年09月13日 11:59
  • 273

Mysql多字段排序

select * from table order by  字段1 desc,字段2 desc
  • lsx991947534
  • lsx991947534
  • 2015年10月17日 15:47
  • 840

yii2 多维数组指定多字段排序

array_multisort() 可以用来一次对多个数组进行排序,或者根据某一维或多维对多维数组进行排序。关联(string)键名保持不变,但数字键名会被重新索引。...
  • qq_35296546
  • qq_35296546
  • 2017年12月15日 13:52
  • 71

Mongo 排序,多个字段排序

Mongo 排序,多个字段排序 Sort sort = null; List orderList = new ArrayList(); if (StringUtils.isNotBlank(re...
  • javaxiongxing
  • javaxiongxing
  • 2017年11月16日 16:34
  • 275

java List多字段排序方法

java中对List接口的实例按实体的字段排序。如下例:package se;import java.util.ArrayList; import java.util.Collections; imp...
  • joson793847469
  • joson793847469
  • 2016年09月28日 11:50
  • 1372

elasticsearch-基于多字段,字符串内部排序

字符串排序与多字段 被解析的字符串字段也是多值字段, 但是很少会按照你想要的方式进行排序。如果你想分析一个字符串,如 fine old art , 这包含 3 项。我们很可能想要按第一项的字...
  • chuan442616909
  • chuan442616909
  • 2017年02月15日 11:24
  • 270

SQL匹配多字段进行排序,搜索

谈到搜索,一般就想起了SQL Server的FullTextSearch(全文搜索)功能,它确实强大,但使用起来也要做一些较为繁琐的准备工作,一般小型的项目或者对搜索要求(包括性能需求)不是很高的情况...
  • diligentcat
  • diligentcat
  • 2011年09月11日 08:33
  • 2823

Java中对单个或多个字段进行排序

Java中对单个字段或多个字段进行排序 import java.util.ArrayList; import java.util.Collections; import java.util.Comp...
  • baidu_18607183
  • baidu_18607183
  • 2015年06月19日 10:37
  • 1927
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:对XML实现自定义、多字段排序
举报原因:
原因补充:

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