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

对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 " >
  
///  
  
/// 实现自定义排序的比较器,可按升序、降序排序
  
/// 

   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(
" " );
    Response.Write(
" 第一排序字段第二排序字段标题 " );
    
while  (nodeIter.MoveNext())
    {
      Response.Write(
" "   +  nodeIter.Current.SelectSingleNode( " ../getlastmodified " ).Value  +   " "   +  nodeIter.Current.SelectSingleNode( " ../createtime " ).Value  +   " "   +  nodeIter.Current.Value  +   " " );
    }
    Response.Write(
" " );
  }
script>

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

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

 相关文章:

在XSLT中实现按日期排序

使用XPathExpression类对XML进行排序




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值