解析属性时,slurper 会在未找到属性时设置一个空字符串。
例如,car.setOwner(node.@owner.text());
在上面的代码中,如果没有找到 owner 属性,那么 slurper 会设置一个空白字符串(“”)。
就我而言,我宁愿将其保留为 null 而不是设置空字符串。
是否可以将 Slurper 配置为不这样做?
解析属性时,slurper 会在未找到属性时设置一个空字符串。
例如,car.setOwner(node.@owner.text());
在上面的代码中,如果没有找到 owner 属性,那么 slurper 会设置一个空白字符串(“”)。
就我而言,我宁愿将其保留为 null 而不是设置空字符串。
是否可以将 Slurper 配置为不这样做?
你可以做
car.setOwner(node.@owner.text() ?: null)
如果我们区分配置和使用元对象协议(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()