对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 >
< 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 >
< 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 方法时需要考虑的重要说明:
- 添加排序的顺序提供排序关键字的使用顺序。
- 如果 XPathExpression 或排序关键字需要命名空间解析,则必须使用 SetContext 方法为命名空间解析提供 XmlNamespaceManager。
- 在调用 SetContext 方法时,所有排序规则都被删除。若要保留排序规则,请在调用 AddSort 方法前调用 SetContext 方法。
- 如果 XPathExpression 不包含前缀,则认为命名空间 URI(统一资源标识符)为空命名空间。如果您的 XML 中包含默认命名空间,则仍须使用 SetContext 方法,并提供包含前缀和命名空间 URI 的 XmlNamespaceManager 以处理默认命名空间。