GINA之XmlParser和XmlSlurper异同

来源:互联网 发布:淘宝店铺名字大全高档 编辑:程序博客网 时间:2024/05/19 23:11



    博客分类: 
  • groovy/grails
GroovyGrailsXML 
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访问

    罗嗦了这么多,接下来,让我们实践一下吧
Java代码  收藏代码
  1. def CAR_RECORDS = '''  
  2.     <records>  
  3.       <car name='HSV Maloo' make='Holden' year='2006'>  
  4.         <country>Australia</country>  
  5.         <record type='speed'>Production Pickup Truck with speed of 271kph</record>  
  6.       </car>  
  7.       <car name='P50' make='Peel' year='1962'>  
  8.         <country>Isle of Man</country>  
  9.         <record type='size'>Smallest Street-Legal Car at 99cm wide and 59 kg in weight</record>  
  10.       </car>  
  11.     </records>  
  12.   '''  
  13. def parserRoot = new XmlParser().parseText(CAR_RECORDS)  
  14. def slurperRoot = new XmlSlurper().parseText(CAR_RECORDS)  
  15. assert 'records'==parserRoot.name()  
  16. assert 'records'==slurperRoot.name()  
  17. assert 2==parserRoot.car.size()  
  18. assert 2==slurperRoot.car.size()  
  19. assert 'P50'==parserRoot.car[1].'@name'  
  20. //assert 'P50'==slurperRoot.car[1].@name //error a bug?  
  21. assert 'P50'==slurperRoot.car[1].@name.text()  
  22. assert slurperRoot.car[1].@name=='P50'  
  23. 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。

原文:http://agile-boy.iteye.com/blog/161286
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 苹果4s充不进电怎么办 苹果4sbi锁怎么办 乐视pro3充电慢怎么办 手机屏幕触碰不灵敏怎么办 手机换屏幕失灵怎么办 手机图标有重影怎么办 苹果屏幕太灵敏怎么办 5s触摸不灵敏怎么办 导航触屏失灵怎么办 汽车导航触摸屏失灵怎么办 爱丽舍导航仪触屏失灵怎么办 手机要开机很久怎么办 小米手机屏失灵怎么办 5s手机屏幕松动怎么办 手机按钮不灵了怎么办 手机触摸屏不灵了怎么办 mac触摸板失灵怎么办 苹果屏幕触摸失灵怎么办 三星手机屏幕没反应怎么办 手机开机定屏怎么办 手机触摸局部失灵怎么办 苹果手机屏幕按键失灵怎么办 5s锁屏键坏了怎么办 平板版本太低怎么办 手机屏局部失灵怎么办 iphone8触屏不灵敏怎么办 苹果机8屏幕失灵怎么办 车钥匙丢车上怎么办 指纹锁华盖坏了怎么办 非法入了户口怎么办 司考成绩单丢了怎么办 小饭桌转让手续怎么办 两个领导不和你怎么办 两个领导意见不一致怎么办 两个领导对立我怎么办 投诉申通没用怎么办 领导作风有问题怎么办 做完火疗受风了难受怎么办 鼻子做的不好看怎么办 埋线双眼皮出血怎么办 割完双眼皮出血怎么办