新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     >>W3CHINA.ORG讨论区<<     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> 本版讨论DOM, SAX, XPath等。
    [返回] W3CHINA.ORG讨论区 - 语义网·描述逻辑·本体·RDF·OWLXML.ORG.CN讨论区 - XML技术『 DOM/SAX/XPath 』 → 使用XPathExpression类对XML进行排序 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 49696 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: 使用XPathExpression类对XML进行排序 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     hsower 帅哥哟,离线,有人找我吗?狮子座1983-8-21
      
      
      威望:7
      等级:大四寒假(收到IBM的Offer啦)
      文章:72
      积分:1606
      门派:XML.ORG.CN
      注册:2004/4/3

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给hsower发送一个短消息 把hsower加入好友 查看hsower的个人资料 搜索hsower在『 DOM/SAX/XPath 』的所有贴子 引用回复这个贴子 回复这个贴子 查看hsower的博客楼主
    发贴心情 使用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名字空间中的类进行的简单的描述:


    XPathDocument:进行XML文档处理时,提供一个快速、有效的、只读的Cache功能,在进行XSLT转换时,推荐使用该类。

    XPathException:当处理XPath产生错误时,抛出一个例外。

    XPathExpression:保存在调用XPathNavigator的Compile()方法时生成的、经过编译的XPath表达式。

    XPathNavigator:提供一个指针模型,供我们读取支持IXPathNavigable接口的所保存的任何类型的数据。

    XPathNodeIterator:遍历节点集合。

    由于要详细讨论每一个类的细节,超出了我们主题的范围,我们只讨论与排序有关的那些类的使用。首先,我们需要创建一个XPathNavigator对象,以便建立XPath表达式来完成我们的排序功能。由于这个类是一个抽象类,我们不能这样直接创建它:

     
      XPathNavigator nav = new XPathNavigator();

    我们必须使用XmlDocument、XmlDataDocument或XPathDocument的CreateNavigator()方法来创建:

      
      XPathDocument doc = new XPathDocument(Server.MapPath("customers.xml"));
      XPathNavigator nav = doc.CreateNavigator();

    创建了XPathNavigator对象后,我们就可以使用Compile()方法编译一个XPath表达式,这个方法返回一个XPathExpression 类,它封装编译过的表达式,同时允许我们进行排序。下面是一个使用XPathNavigator类创建一个编译过的XPath表达式的例子:

     
      XPathExpression exp = nav.Compile(xpath);

    我们通过使用XPathExpression对象的AddSort()方法实现排序的功能,这个方法有两个重载的方式:

      public abstract void AddSort(object expr, IComparer comparer);
      
      public abstract void AddSort(
         object expr,
         XmlSortOrder order,
         XmlCaseOrder caseOrder,
         string lang,
         XmlDataType dataType
      );

    第一个方法允许我们使用自定义的排序表达式;第二个方法有5个参数:分别是要排序的对象、排序顺序、条件顺序、语言类别和数据类型,下面就是使用该方法进行排序的例子:

     
      exp.AddSort("text()",XmlSortOrder.Ascending,XmlCaseOrder.None,"",XmlDataType.Text);

    一旦我们对XPath表达式添加了排序的功能,我们就可以调用XPathNavigator对象的Select()方法,并把编译过的XPath表达式作为参数,Select()方法返回一个XPathNodeIterator对象,我们可以使用它遍历我们所选择的节点。

    下面就是用C#编写的实现排序功能的所有代码:

     
     private void Page_Load(object sender, System.EventArgs e) {
      StringBuilder unsorted = new StringBuilder();
      StringBuilder sorted = new StringBuilder();
      string xpath = "/Customers/Customer/ContactName";
     
      XPathDocument doc = new XPathDocument(Server.MapPath("customers.xml"));
      XPathNavigator nav = doc.CreateNavigator();
     
      XPathNodeIterator nodeIter1 = nav.Select(xpath);
      while (nodeIter1.MoveNext()) {
       unsorted.Append(nodeIter1.Current.Value + "<br />");
      }
      this.lblUnsorted.Text = unsorted.ToString();
     
      XPathExpression exp = nav.Compile(xpath);
      exp.AddSort("text()",XmlSortOrder.Ascending,
                       XmlCaseOrder.None,"",XmlDataType.Text);
     
      XPathNodeIterator nodeIter2 = nav.Select(exp);
      while (nodeIter2.MoveNext()) {
       sorted.Append(nodeIter2.Current.Value + "<br />");
      }  
      this.lblSorted.Text = sorted.ToString();
     }


       收藏   分享  
    顶(0)
      




    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/1/21 10:42:00
     
     casual12 帅哥哟,离线,有人找我吗?
      
      
      等级:大一(猛啃高等数学)
      文章:22
      积分:151
      门派:XML.ORG.CN
      注册:2004/7/28

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给casual12发送一个短消息 把casual12加入好友 查看casual12的个人资料 搜索casual12在『 DOM/SAX/XPath 』的所有贴子 引用回复这个贴子 回复这个贴子 查看casual12的博客2
    发贴心情 
    首先,谢谢hsower为我们带来的这篇好文章。
    我看了这文章之后,有几个小问题想请教一下:
    =====================================================

    第二个方法有5个参数:分别是要排序的对象、排序顺序、条件顺序、语言类别和数据类型,下面就是使用该方法进行排序的例子:
    exp.AddSort("text()",XmlSortOrder.Ascending,XmlCaseOrder.None,"", XmlDataType.Text);
    =====================================================
    我对这个方法中的第一个参数感到疑惑。我自己查了MSDN,也还是不明白。第一个参数明明是“要排序的对象”,怎么变成了那个?MSDN上说一般这个参数都是默认为String(),那么请问一下这个“text()”是不是已经在类库里面定义好的阿?如果我想换一个自己定义的名字,如:test,那我改怎么处理?

    谢谢!

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/2/1 11:06:00
     
     casual12 帅哥哟,离线,有人找我吗?
      
      
      等级:大一(猛啃高等数学)
      文章:22
      积分:151
      门派:XML.ORG.CN
      注册:2004/7/28

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给casual12发送一个短消息 把casual12加入好友 查看casual12的个人资料 搜索casual12在『 DOM/SAX/XPath 』的所有贴子 引用回复这个贴子 回复这个贴子 查看casual12的博客3
    发贴心情 
    首先,谢谢hsower为我们带来的这篇好文章。
    我看了这文章之后,有几个小问题想请教一下:
    =====================================================
    第二个方法有5个参数:分别是要排序的对象、排序顺序、条件顺序、语言类别和数据类型,下面就是使用该方法进行排序的例子:
    exp.AddSort("text()",XmlSortOrder.Ascending,XmlCaseOrder.None,"", XmlDataType.Text);
    =====================================================
    我对这个方法中的第一个参数感到疑惑。我自己查了MSDN,也还是不明白。第一个参数明明是“要排序的对象”,怎么变成了那个?MSDN上说一般这个参数都是默认为String(),那么请问一下这个“text()”是不是已经在类库里面定义好的阿?如果我想换一个自己定义的名字,如:test,那我该怎么处理?

    谢谢!

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/2/1 11:06:00
     
     niekui 帅哥哟,离线,有人找我吗?双鱼座1987-3-2
      
      
      等级:大一(高数修炼中)
      文章:16
      积分:111
      门派:XML.ORG.CN
      注册:2005/3/2

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给niekui发送一个短消息 把niekui加入好友 查看niekui的个人资料 搜索niekui在『 DOM/SAX/XPath 』的所有贴子 访问niekui的主页 引用回复这个贴子 回复这个贴子 查看niekui的博客4
    发贴心情 
    我也有问题材想问你但是看你这么好的文章还是先看看再说吧
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/3/2 16:21:00
     
     casual12 帅哥哟,离线,有人找我吗?
      
      
      等级:大一(猛啃高等数学)
      文章:22
      积分:151
      门派:XML.ORG.CN
      注册:2004/7/28

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给casual12发送一个短消息 把casual12加入好友 查看casual12的个人资料 搜索casual12在『 DOM/SAX/XPath 』的所有贴子 引用回复这个贴子 回复这个贴子 查看casual12的博客5
    发贴心情 
    最近看了好多XML方面的东西,发现那个test()用的很多,估计是默认的!
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/3/22 9:41:00
     
     niuniu502 帅哥哟,离线,有人找我吗?
      
      
      等级:大一(高数修炼中)
      文章:13
      积分:119
      门派:XML.ORG.CN
      注册:2005/3/24

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给niuniu502发送一个短消息 把niuniu502加入好友 查看niuniu502的个人资料 搜索niuniu502在『 DOM/SAX/XPath 』的所有贴子 引用回复这个贴子 回复这个贴子 查看niuniu502的博客6
    发贴心情 
    我的理解是,test()是已定义的方法,返回值指向一个由你自己指定的上下文节点的文本接点,返回一个文本值,若无文本接点存在,则返回空值.
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/4/23 20:52:00
     
     Rayz 帅哥哟,离线,有人找我吗?
      
      
      等级:大二(研究汇编)
      文章:52
      积分:297
      门派:XML.ORG.CN
      注册:2004/11/28

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给Rayz发送一个短消息 把Rayz加入好友 查看Rayz的个人资料 搜索Rayz在『 DOM/SAX/XPath 』的所有贴子 引用回复这个贴子 回复这个贴子 查看Rayz的博客7
    发贴心情 
    好,收藏之
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/3/9 11:23:00
     
     nonotoday 帅哥哟,离线,有人找我吗?
      
      
      等级:大一(高数修炼中)
      文章:14
      积分:133
      门派:XML.ORG.CN
      注册:2006/2/23

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给nonotoday发送一个短消息 把nonotoday加入好友 查看nonotoday的个人资料 搜索nonotoday在『 DOM/SAX/XPath 』的所有贴子 引用回复这个贴子 回复这个贴子 查看nonotoday的博客8
    发贴心情 
    Mark...
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/4/3 16:27:00
     
     bluezsy 帅哥哟,离线,有人找我吗?
      
      
      等级:大一(高数修炼中)
      文章:13
      积分:114
      门派:XML.ORG.CN
      注册:2006/2/15

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给bluezsy发送一个短消息 把bluezsy加入好友 查看bluezsy的个人资料 搜索bluezsy在『 DOM/SAX/XPath 』的所有贴子 引用回复这个贴子 回复这个贴子 查看bluezsy的博客9
    发贴心情 
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/5/9 22:22:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 DOM/SAX/XPath 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/11/25 23:37:45

    本主题贴数9,分页: [1]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 解固 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    93.750ms