对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 " >
  
///   <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 以处理默认命名空间。

 相关文章:

在XSLT中实现按日期排序

使用XPathExpression类对XML进行排序

【72】【OpenCV C++ & C#】 将cv::Mat 图像转换成imgINFO 传给c#在winform上显示,OpenCV C++如何将处理后的图像传给C#呢? 如何获取图像信息呢? 本文介绍了通过OpenCV C++处理图像后传递给C#的方法。首先定义了一个结构体imgINFO存储图像信息(数据指针、宽高、通道数等),然后通过getImgInfo函数将cv::Mat转换为该结构体。文章特别指出当图像宽度不能被4整除时可能出现失真问题,并给出了两种解决方案:调整输入图像或创建新的对齐图像。此外还解释了img.step和img.cols*img.elemSize()的关系,说明它们在大多数情况下是相等的。最后提到需要通过DLL将结构体传递给C#(具体方法参见其他文章)。 阅读详情

相关推荐

小红书urlscheme和Activity

本文档详细介绍了小红书App的Deeplink跳转规范,涵盖了多个功能模块的跳转协议。主要内容包括:主页各Tab(关注、发现、购买)的跳转方式;不同类型笔记(图文/视频/长笔记)的详情页跳转参数;用户相关页面(主页/绑定/资料/消息等)的跳转协议;搜索功能(输入页/结果页)的跳转方式;以及话题、标签、专辑、H5页面等特殊场景的跳转实现。文档还提供了各跳转协议所需的参数说明,包括参数类型、默认值、是否必填等详细信息,并标注了不同版本和平台的兼容性要求。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 743

详解XML节点属性排序

用python实现“对xml节点中的属性进行排序

ybdesire的专栏 5243

思维CDLINUX无线WIFI破解软件.

思维CDLINUX无线WIFI破解软件.

XML排序通用方案

要对整个 XML 文档中的所有标签进行排序,你需要递归地遍历整个文档,然后将节点进行排序。这个示例代码递归地对整个 XML 文档进行了遍历和排序。请注意,处理复杂的 XML 结构可能需要更多的处理和调整,具体取决于你的实际需求。

2301_79510050的博客 774

sqlserver2012 无法将一个或多个字符从 XML 转换为目标排序规则

sqlserver2012 无法将一个或多个字符从 XML 转换为目标排序规则问题 aaa是xml字段类型,字段代码231。 因为以前里面没有乱码情况所以没报错,今天报错了找了好多文章都不好用。 我库的排序规则:Chinese_PRC_CI_AS 通过下面方式转换数据 cast(aaa as nvarchar(max)) COLLATE Chinese_PRC_CI_AS ...

tqwer的专栏 1753

Mybatis自定义SQL动态排序实现

1、需求 根据查询列表,条件中可以自定义排序字段和acs desc 2、实现 queryParam public class XxxQueryCondition extends BaseQueryParam { private String name; private Integer status; private Integer level; } /**------------------------------------*/ @Data @AllArgsConstructor

weixin_44329984的博客 4272

Mybatis多字段排序

        从前学习Spring开发的时候写过一个Web系统,后端采用Spring+SpringMVC+MyBatis,前端使用BootStrap和LigerUI,业务数据采用LigerUI的LigerGrid进行展示,由于LigerGrid只能支持单字段排序,有些时候业务需要进行多字段排序,刚好也准备重新换一下前端界面效果和框架,最近刚好看了下EasyUI,发现EasyUI是可以支持多字段排...

chenheheyang的博客 1万+

elementUI 多字段全部数据排序

elementUI全部数据多字段排序

weixin_42397937的博客 2771

jdk8多字段排序

背景 最近针对代码改造,由于原有实体类是经过排序的,而改造后,懒得去xml增加排序。因此将排序放在java代码进行。 实现 public class Test { public static void main(String[] args) { List<Student> sList = new ArrayList<Student>(); IntStream.ra...

laosun12的专栏 1602

Mybatis自定义SQL的关系映射、分页、排序

目的: 记录数据库表与实体对象之间不同的映射关系如何用mybatis的自定义sql和结果返回集处理。 1、三种对象映射关系 1.1 一对一 一个人对应一个身份证,一位同学对应一个班级,每个房间都有自己的房间号,当一个事物它对应另一个事物是唯一的,那么它们之间的关系就是一对一的。 这里我演示的案例是,一个学生有着一位老师 老师基础信息: 学生详细信息: 如果说,我们需要将两个表一起查出来,我们可以这么做: 问题: 如果对象的列重复了,必须要使用到别名 1、先定义实体结构,也就是我们返结果的实体类 publ

记录,记录,记录 817

xml排序

1 xsl:sort所使用的名字空间:xmlns:xsl=http://www.w3.org/1999/XSL/TransformSyntaxselect="expression"lang="language-code"data-type="text|number|qname"     //数据类型,可支持按数字排序order="ascending|desc

denny的专栏 5622

XML数据排序

  根据XML数据的Index 来进行排序   方法一: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Xml.Linq; namespace XMLOrderby { class Program { ...

javajavami的博客 656

xml排序文件

<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.c.

m0_59726275的博客 1412

idea的xml文件按字母顺序排序

按情况,选择Matching rules里面关于a->z排序的,order by name换成 keep order即可!xml文件的namespace自动按字母顺序排序

Fugue1212的博客 545
上一篇: Indent,Outdent和hanging indent
下一篇: 天使不敢走的路,傻子一步就能跨过去
java2000_test
博客等级 码龄19年 9粉丝 320原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值