以文本方式查看主题 - 中文XML论坛 - 专业的XML技术讨论区 (http://bbs.xml.org.cn/index.asp) -- 『 DOM/SAX/XPath 』 (http://bbs.xml.org.cn/list.asp?boardid=11) ---- 使用XPathExpression类对XML进行排序 (http://bbs.xml.org.cn/dispbbs.asp?boardid=11&rootid=&id=13894) |
-- 作者:hsower -- 发布时间:1/21/2005 10:42:00 AM -- 使用XPathExpression类对XML进行排序 如果你曾经使用过XSLT,当你需要对XML文档中的字符串或数字进行排序时,你可能会习惯于使用xsl:sort元素,在进行xsl:for-each进行循环或用xsl:apply-templates调用模板时,这个元素的功能很方便,而且简单。然而,在某些情况下,你只是想简单对XML文档进行简单的排序和显示数据,那么xsl:sort就会大大降低计算机性能,下面就解释一下,如何在不使用xsl:sort元素的情况下,实现对XML数据进行排序。 在.NET平台下,要完成这样的工作非常轻松,我们只需使用System.Xml.XPath名字空间里的几个类即可,如XPathNavigator和XPathExpression。这些类相当于XSLT中XPath的功能,允许你在XML文档中进行遍历,也可以进行排序的操作。下面是对System.Xml.XPath名字空间中的类进行的简单的描述: XPathException:当处理XPath产生错误时,抛出一个例外。 XPathExpression:保存在调用XPathNavigator的Compile()方法时生成的、经过编译的XPath表达式。 XPathNavigator:提供一个指针模型,供我们读取支持IXPathNavigable接口的所保存的任何类型的数据。 XPathNodeIterator:遍历节点集合。 由于要详细讨论每一个类的细节,超出了我们主题的范围,我们只讨论与排序有关的那些类的使用。首先,我们需要创建一个XPathNavigator对象,以便建立XPath表达式来完成我们的排序功能。由于这个类是一个抽象类,我们不能这样直接创建它: 我们必须使用XmlDocument、XmlDataDocument或XPathDocument的CreateNavigator()方法来创建: 创建了XPathNavigator对象后,我们就可以使用Compile()方法编译一个XPath表达式,这个方法返回一个XPathExpression 类,它封装编译过的表达式,同时允许我们进行排序。下面是一个使用XPathNavigator类创建一个编译过的XPath表达式的例子: 我们通过使用XPathExpression对象的AddSort()方法实现排序的功能,这个方法有两个重载的方式: public abstract void AddSort(object expr, IComparer comparer); 第一个方法允许我们使用自定义的排序表达式;第二个方法有5个参数:分别是要排序的对象、排序顺序、条件顺序、语言类别和数据类型,下面就是使用该方法进行排序的例子: 一旦我们对XPath表达式添加了排序的功能,我们就可以调用XPathNavigator对象的Select()方法,并把编译过的XPath表达式作为参数,Select()方法返回一个XPathNodeIterator对象,我们可以使用它遍历我们所选择的节点。 下面就是用C#编写的实现排序功能的所有代码:
|
-- 作者:casual12 -- 发布时间:2/1/2005 11:06:00 AM -- 首先,谢谢hsower为我们带来的这篇好文章。 我看了这文章之后,有几个小问题想请教一下: ===================================================== 第二个方法有5个参数:分别是要排序的对象、排序顺序、条件顺序、语言类别和数据类型,下面就是使用该方法进行排序的例子: 谢谢! |
-- 作者:casual12 -- 发布时间:2/1/2005 11:06:00 AM -- 首先,谢谢hsower为我们带来的这篇好文章。 我看了这文章之后,有几个小问题想请教一下: ===================================================== 第二个方法有5个参数:分别是要排序的对象、排序顺序、条件顺序、语言类别和数据类型,下面就是使用该方法进行排序的例子: exp.AddSort("text()",XmlSortOrder.Ascending,XmlCaseOrder.None,"", XmlDataType.Text); ===================================================== 我对这个方法中的第一个参数感到疑惑。我自己查了MSDN,也还是不明白。第一个参数明明是“要排序的对象”,怎么变成了那个?MSDN上说一般这个参数都是默认为String(),那么请问一下这个“text()”是不是已经在类库里面定义好的阿?如果我想换一个自己定义的名字,如:test,那我该怎么处理? 谢谢!
|
-- 作者:niekui -- 发布时间:3/2/2005 4:21:00 PM -- 我也有问题材想问你但是看你这么好的文章还是先看看再说吧 |
-- 作者:casual12 -- 发布时间:3/22/2005 9:41:00 AM -- 最近看了好多XML方面的东西,发现那个test()用的很多,估计是默认的! |
-- 作者:niuniu502 -- 发布时间:4/23/2005 8:52:00 PM -- 我的理解是,test()是已定义的方法,返回值指向一个由你自己指定的上下文节点的文本接点,返回一个文本值,若无文本接点存在,则返回空值. |
-- 作者:Rayz -- 发布时间:3/9/2006 11:23:00 AM -- 好,收藏之 |
-- 作者:nonotoday -- 发布时间:4/3/2006 4:27:00 PM -- Mark... |
-- 作者:bluezsy -- 发布时间:5/9/2006 10:22:00 PM -- 好 |
W 3 C h i n a ( since 2003 ) 旗 下 站 点 苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》 |
66.406ms |