加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Groovy Tip 28 Gpath

发布时间:2020-12-14 16:58:26 所属栏目:大数据 来源:网络整理
导读:?????????????????????? Groovy Tip 28 Gpath ? ? 在 Groovy 语言中, Gpath 可能是我们最常用的一种功能了。当然了,我们使用 Gpath 大多用在对 GroovyBean 对象的操作上。其实,除了操作 GroovyBean 对象, Gpath 还用在对 XML 文档的操作上。即使是用于对

?????????????????????? Groovy Tip 28 Gpath

?

?

Groovy语言中,Gpath可能是我们最常用的一种功能了。当然了,我们使用Gpath大多用在对GroovyBean对象的操作上。其实,除了操作GroovyBean对象,Gpath还用在对XML文档的操作上。即使是用于对GroovyBean对象的操作,我们也未必对Gpath的使用知之甚详,所以我们这篇就来详细说说Gpath

首先,Gpath用到对类的属性的操作上,是用于对对象属性的访问,形如:“对象.属性”的访问方式。比如,我们有如下的两个GroovyBean

class Address

{

??? String prov

??? String city

}

?

class Person

{

??? String id

??? String name

??? Address addr

}

?

现在,我们就可以使用Gpath来操作它们:

?

??? ? def addr = new Address(prov:'Hubei',city:'Xiaogan')

??? ?

??? ? def person = new Person(id:123,name:'Wallace',addr:addr)

??? ?

??? ? println person.name

??? ?

??? ? println person.addr.city

???

?

运行结果为:

Wallace

Xiaogan

?

可以看到“person.name”访问的是对象“person”的属性“name”,而“person.addr.city”则是先访问“person”的属性“addr”,然后再访问“addr”的属性“city”。通过这样的一种访问方式,使得这种类的组合方式不论嵌套多少层,都可以使用Gpath访问得到。

值得注意的是,上面的嵌套访问并不是安全的。请看下面的例子:

?

??? ?def person = new Person(id:123,name:'Wallace')

??? ?

? println person.addr.city

?

这样的访问就会报空指针的错误。为了解决这种空指针的错误,在Java语言中通常要做如下的非空判断:

?

?

??? ? if(person!=null&&person.addr!=null)

??? ? {

?????? ? println person.addr.city

? }

?

而在Groovy语言中则无需这么麻烦,我们只需要使用“?.”操作符即可,它的结果是如果Gpath访问的对象存在,则返回结果;否则返回null。请看下面的例子:

?

?

??? ?def person = new Person(id:123,name:'Wallace')

??? ?

??? ? println person?.addr?.city

???

?

运行结果为:

null

?

其次,如果是对XML文档的访问,则“a.b.c”代表的是节点“<a>”中包含节点“<b>”, 节点“<b>”中包含节点“<c>”,即形如下面的样子:

<a>

??????? <b>

?????????????? <c>…</c>

??????? </b>

</a>

?

?

下面,我们来看一个实际的例子:

?

??? ? def text = """

??? ? ????? <persons>

??? ? ???????? <person sex='male'>

??? ? ???????????? <id>1</id>

??? ? ???????????? <name>Tom</name>

??? ? ???????? </person>

??? ? ???????? <person sex='female'>

? ??????????????? <id>2</id>

? ??????????????? <name>Alice</name>

? ???????????? </person>

? ???????? </persons>

??? ? """

??? ?

??? ? def node = new XmlSlurper().parseText(text)

??? ?

??? ? node.person.each{

?????? ? println it.name

??? ? }

??? ?

???

? }

?

运行结果为:

Tom

Alice

?

可以看到,变量“node”是XML文档的根节点,即“persons”节点。而节点“node.person”存在多个节点,所以要进行循环,然后再一次往下数节点即可。

GroovyBean对象的Gpath访问比起来,除了GpathXML的访问会遇到多节点以外,GpathXML的访问不会存在空指针的情况。请看下面的例子:

?

??? ? println node.p.x

?

?

运行结果是打印空行。可以看出,如果XML的节点不存在,那么返回的是空字符串。

?

还有需要注意的是:使用Gpath访问GroovyBean对象的属性并不是直接访问该属性,而是通过“set”和“get”方法进行的。请看下面的例子:

?

class Person

{

??? String id

??? String name

??? Address addr

???

??? def getName()

??? {

?????? return 'Tom'

??? }

}

?

在上面的“Person”类中,我们自己定义了“getName”方法,让它永远返回“Tom”,下面,我们使用Gpath来测试它:

?

??? ? def person = new Person(id:123,name:'Wallace')

??? ?

??? ? println person.name

?

运行结果为:

Tom

?

由于我们在“person”对象的定义中设置了“name”属性的值为“Wallace”,很明显,“person”对象的“name”属性值为“Wallace”,但我们使用“person.name”访问的返回值只能是“Tom”,因为方法“getName”永远返回“Tom”。

当然,我们也有办法访问属性的真实值,这就是使用“.@”操作符。请看下面的例子:

def person = new Person(id:123,name:'Wallace')

??? ?

??? ? println person.name

??? ?

? println person.@name

?

运行结果为:

Tom

Wallace

?

当然了,上面的情况又是通过Gpath访问GroovyBean对象的特殊情况,在通过Gpath访问XML的时候不会存在上面的情况。但是,在通过Gpath访问XML的时候,“.@”操作符也有它自己的用途。请看下面的例子:

?

?

??? ? def text = """

??? ? ????? <persons>

??? ? ???????? <person sex='male'>

??? ? ???????????? <id>1</id>

??? ? ???????????? <name>Tom</name>

??? ? ???????? </person>

??? ? ???????? <person sex='female'>

? ??????????????? <id>2</id>

? ??????????????? <name>Alice</name>

? ???????????? </person>

? ???????? </persons>

??? ? """

??? ?

??? ? def node = new XmlSlurper().parseText(text)

??? ?

??? ? node.person.each{

?????? ? println it.@sex

? }

?

运行结果为:

male

female

?

可以看出,使用“.@”操作符可以访问一个节点的属性。

说到这里,总算是对Gpath做了一个全面的、基本的交代。为什么说是一个基本的交代呢?其实就在于使用Gpath访问XML还有很多的内容,在这里不能一一交代了。请大家在用到的时候查阅相关的文档。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读