0

解析属性时,slurper 会在未找到属性时设置一个空字符串。

例如,car.setOwner(node.@owner.text());

在上面的代码中,如果没有找到 owner 属性,那么 slurper 会设置一个空白字符串(“”)。

就我而言,我宁愿将其保留为 null 而不是设置空字符串。

是否可以将 Slurper 配置为不这样做?

4

2 回答 2

3

你可以做

car.setOwner(node.@owner.text() ?: null)
于 2014-05-27T16:51:26.140 回答
1

如果我们区分配置和使用元对象协议(MOP),那么我们可以声明无法像您描述的那样配置 XmlSlurper,但可以使用 MOP。

对于配置,请注意以下几点:

def node = new XmlSlurper().parseText('<car>No Owner</car>' )

def attr = node.@owner
assert groovy.util.slurpersupport.Attributes == attr.getClass()

如果您查看(在本例中为 Groovy 2.2.2)的代码Attributes.text()很明显不能将其配置为返回 null。

对于 MOP,我们可以捕获原始Attributes.text()方法,然后覆盖它:

import groovy.util.slurpersupport.*

def originalText = Attributes.metaClass.getMetaMethod("text")

Attributes.metaClass.text = { ->
    def result = originalText.invoke(delegate)
    if (result.isEmpty()) {
        result = null
    }
    result
}

// no owner
def node = new XmlSlurper().parseText('<car>No Owner</car>')
def attr = node.@owner
assert null == attr.text()

// with owner
node = new XmlSlurper().parseText('<car owner="codetojoy"></car>')
attr = node.@owner
assert "codetojoy" == attr.text()
于 2014-05-28T02:03:45.447 回答