`
agile_boy
  • 浏览: 556786 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

GINA之XmlParser和XmlSlurper异同

阅读更多
GINA:Groovy In Action 
    Groovy的Document中只是介绍了XmlParser和XmlSlurper常用的用法,而且给你的感觉他俩孪生兄弟,给你相似的同时也给你疑惑 还好在GIA中还有比较好的解释。
    先来看看他们的相同之处。
  • 构造方法都是一模一样的,从缺省的构造到自定义的reader,parser等完全的一样
  • 解析XML的parse/parseText方法参数也完全的一致,当然了返回结果类型是不一样的
  • 返回结果类型虽然不一样,但是他们处理GPath的语法却是那么一致
其实,处理XML我们比较关注的还是处理Xml的过程,也就是parser的返回结果,可喜的是groovy.util.Node(XmlParser)和GPathResult(XmlSlurper)对GPath的支持都很好,以下简单罗列一下他们常用的共同的方法:
  • name() 返回值:Node->Object,GPathResult->String
  • text() 返回值:String
  • toString() 返回值:String
  • parent() 返回值:Node->Node,GPathResult->GPathResult,快捷方式:'..'
  • children() 返回值:Node->List,GPathResult->GPathResult,快捷方式:'*'
  • attributes() 返回值:Map,在GPathResult中并不存在此方法,但是当是节点类型时候会有此方法(实际上还是调用Node的attributes)
  • iterator() 返回值:Iterator
  • depthFirst() 返回值:Node->List,GPathResult->Iterator,快捷方式:'**'
  • breadthFirst() 返回值:Node->List,GPathResult->Iterator
此外对XML元素和属性的操作也是同样的一致,如下:
  • ['elementName']或.elementName,通过名称访问子元素
  • [index],通过下标访问子元素
  • ['@attributeName']或.'@attributeName',访问属性,GPathResult也可以将引号去掉,直接用.@attributeName访问

    罗嗦了这么多,接下来,让我们实践一下吧
def CAR_RECORDS = '''
    <records>
      <car name='HSV Maloo' make='Holden' year='2006'>
        <country>Australia</country>
        <record type='speed'>Production Pickup Truck with speed of 271kph</record>
      </car>
      <car name='P50' make='Peel' year='1962'>
        <country>Isle of Man</country>
        <record type='size'>Smallest Street-Legal Car at 99cm wide and 59 kg in weight</record>
      </car>
    </records>
  '''
def parserRoot = new XmlParser().parseText(CAR_RECORDS)
def slurperRoot = new XmlSlurper().parseText(CAR_RECORDS)
assert 'records'==parserRoot.name()
assert 'records'==slurperRoot.name()
assert 2==parserRoot.car.size()
assert 2==slurperRoot.car.size()
assert 'P50'==parserRoot.car[1].'@name'
//assert 'P50'==slurperRoot.car[1].@name //error a bug?
assert 'P50'==slurperRoot.car[1].@name.text()
assert slurperRoot.car[1].@name=='P50'
assert slurperRoot.car.any{ it.@name == 'P50' }


&nbsp;&nbsp;&nbsp;&nbsp;说了那么多行同点,不禁要问既生“XmlParser”又生“XmlSlurper”,何必呢,马上我们来看不同之处。前面也可以看到,它们最大的不同就是parse的返回类型不同,因此主要是groovy.util.Node(XmlParser)和GPathResult(XmlSlurper)的不同。
&nbsp;&nbsp;&nbsp;&nbsp;groovy.util.Node是以list的形式来表述GPath的,因此Node在可显性有着明显的优势,比如toString可以直接看到结果,可以直接print,可以在原处修改等等。那缺点呢?显而易见,因为用list来表述,因此也需要额外的内存空间来存储,这在Xml内容小的时候,没啥问题,可一旦处理大量的Xml时,要慎之!慎之!罗列一些Node特有的方法
  • Object value()
  • void setValue(Object value)
  • Object attribute(Object key)
  • NodeList getAt(QName name)
  • void print(PrintWriter out)

&nbsp;&nbsp;&nbsp;&nbsp;再来看看GPathResult,它没有使用list来处理GPath,而是采用iterators方式,因此没有了额外空间消耗,可是如果要访问最后一个node时候,可要费点时间了 罗列一些GPathResult特有的方法
  • GPathResult parents()
  • GPathResult declareNamespace(Map newNamespaceMapping)
  • List list()
  • int size()
  • GPathResult find(Closure closure)
  • GPathResult findAll(Closure closure)

&nbsp;&nbsp;&nbsp;&nbsp;总之,两种方式各有优缺点,每个人可以根据实际的情况灵活应用,另外Grails的plugin的doWithWebDescriptor参数就是XmlSlurper。
1
0
分享到:
评论
2 楼 agile_boy 2008-02-03  
哦,对,应该是2,多谢提醒,我测试的时候是3个,后来为了让文章短点,就去掉一个car
1 楼 JohnnyJian 2008-02-03  
为什么parserRoot.car.size()和slurperRoot.car.size()是3?不是2吗?

相关推荐

    GINA之windows登录控制替换

    GINA之Windows登录控制替换 在Windows操作系统中,登录控制是由WinLogon和GINA DLL共同实现的。GINA DLL提供了一个交互式的界面为用户登录提供认证请求,而WinLogon则负责调用GINA DLL来实现登录控制。 在NT/2000/...

    定制 自定义 GINA ,Customing GINA

    定制自定义GINA,...在本文中,我们将详细介绍 GINA 的结构和实现机制,包括 GINA 的组件、GINA 的生命周期、GINA 的调试和测试等。同时,我们还将介绍如何自定义 GINA,包括使用 GINASTUB 和 GINAHOOK 两种方法。

    GINA1.zip_gina_zip

    6. **服务集成**:如果自定义GINA是为了集成特定的认证服务(如LDAP、Radius、ADFS等),则需要熟悉这些服务的工作原理以及如何与之通信。 7. **日志与审计**:自定义GINA可能需要记录详细的登录活动,以便进行安全...

    修改GINA,自己实现Windows登陆过程

    在Windows XP和Server 2003中,GINA是登录界面的核心组件,允许开发者自定义登录屏幕的行为和认证机制。通过修改GINA,我们可以实现个性化的登录体验或者集成特定的认证系统。 ### GINA的结构与工作原理 1. **结构...

    Windows登录Gina的Dll

    文件列表中的`ginastub.c`和`ftpcheck.c`可能是实现Gina功能的源代码,`ginastub.c`可能是基础的Gina入口点,而`ftpcheck.c`可能包含了一种特定的验证逻辑,比如检查FTP服务器上的用户账户信息。 `gina.001`可能是...

    Win7下的Gina

    早期版本的Windows(如Windows XP)使用了Gina(Graphical Identification and Authentication)接口来实现登录界面和用户认证功能。随着技术的发展,特别是从Windows Vista开始,微软引入了一个全新的架构——...

    Gina 开机登陆

    ### Gina 开机登录知识点解析 #### 一、Gina开机登录概述 在Windows XP系统中,Gina(Graphical Identification and Authentication)是一个重要的组件,它负责处理用户登录、注销、切换用户等操作。通过理解Gina...

    gina源码 替换windows登陆界面

    Gina(Generic Interface for Network Authentication)是Windows XP和Windows Server 2003中的一个组件,主要用于处理用户登录过程中的身份验证。它提供了一个接口,允许开发者自定义Windows登录界面,实现个性化或...

    full gina 完整Sample

    总结,Gina完整样例提供了一个深入理解自定义登录过程的平台,通过学习和分析OKGina,开发者可以掌握Gina的实现细节,并根据需求定制自己的安全登录解决方案。对于任何关注系统安全性和用户认证流程的IT专业人员来说...

    替换gina登录界面

    但为了满足特殊需求或进行定制化开发,一些开发者会创建自己的Gina模块,比如"cooldoggina.dll",它可以替换原生的Gina,从而改变登录界面的外观和功能。 替换Gina的过程需要注意以下几点: 1. **风险评估**:修改...

    替换GINA_DLL实现自己的登陆界面

    GINA(Gina Generic Interface)是Windows XP及以下版本中用于用户身份验证的一个动态链接库,它负责处理用户的登录和注销操作。默认情况下,系统使用MSGINA.DLL来处理这些任务,但开发者可以通过编写自己的GINA模块...

    GINA.dll 各函数介绍

    **GINA.dll (Graphical Identification and Authentication Dynamic Link Library)** 是Windows操作系统中用于处理用户身份验证的关键组件,特别是在Windows 2000/NT系统中。它作为Winlogon的一个插件,负责图形化的...

    gina.sample.zip_full_gina_gina source code

    本篇文章将深入探讨MS GINA及其附带的完整源代码样本——gina.sample.zip_full_gina_gina_source_code,帮助读者理解其工作原理和可能的应用场景。 首先,让我们了解什么是GINA。GINA,全称为Graphical ...

    替换windows 登陆界面,GINA

    1. 开发自定义GINA模块:你需要编写一个新的DLL,实现GINA接口,这个DLL将替代系统默认的GINA,提供定制的登录界面和认证逻辑。 2. 注册自定义GINA:完成DLL编写后,需要将其注册到系统中。这通常通过修改注册表键`...

    替换GINA_DLL实现自己的登陆

    在Windows操作系统中,GINA(Gina Dynamic Link Library)是图形身份验证接口,它负责处理用户登录和注销过程。在Windows XP及更早版本中,GINA是系统级组件,允许开发者自定义登录过程,以满足特定的安全需求或提供...

    Gina dll 程序,已经替换登陆界面

    Gina (Graphical Identification and Authentication) 是Windows操作系统中的一种组件,主要负责用户身份验证过程,尤其是在Windows XP和Server 2003等较早版本中。Gina全称为图形识别和认证接口,它是一个动态链接...

    xp Gina 示例

    在提供的压缩包文件"GINA"中,可能包含了一个示例的自定义Gina DLL以及相关文档或说明,用于指导开发者如何创建和应用自定义Gina。这些资源可能包括源代码、编译后的DLL、示例配置、使用教程等,帮助理解Gina的工作...

    Gina dll编写

    在Windows XP和Server 2003之前,Gina.dll是自定义登录界面的关键组件,允许开发者创建自己的身份验证模块以实现特定的安全策略。 在标题" Gina dll编写"中,我们聚焦的是如何开发和编写Gina动态链接库(DLL)。...

    dog gina修改XP系统登录logo

    在Windows XP系统中,"dog gina"是一个非官方的个性化工具,用于修改登录界面的logo,即用户登录时看到的图形用户身份验证接口(Graphical Identification and Authentication)。"Gina"是Windows XP中的一项核心...

Global site tag (gtag.js) - Google Analytics