2

Groovy 的MarkupBuilder有一个omitNullAttributes和一个omitEmptyAttributes. 但是DOMBuilder没有。这是我的代码

>>> def xml = DOMBuilder.newInstance()
>>> def maybeEmpty = null
>>> println xml.foo(bar: maybeEmpty)
<foo bar=""/>

bar如果为空,我想被省略。我在 Groovy AntBuilder 的答案中找到了一种解决方法,省略条件属性...findAll清空属性并删除它们。由于要生成复杂的 DOM,因此我正在寻找其他选项。

4

1 回答 1

2

我相信没有内置选项,但如果你需要一个 DOMBuilder,你可以子类化它并过滤属性......

@groovy.transform.InheritConstructors
class DOMBuilderSubclass extends groovy.xml.DOMBuilder {
    @Override
    protected Object createNode(Object name, Map attributes) {
        super.createNode name, attributes.findAll{it.value != null}
     }
}

您可能希望像在标准 DOMBuilder 中一样调整构造,这只是一个示例。

def factory = groovy.xml.FactorySupport.createDocumentBuilderFactory().newDocumentBuilder()
def builder = new DOMBuilderSubclass(factory)
println builder.foo(bar: null, baz: 1)
//<?xml version="1.0" encoding="UTF-8"?>
//<foo baz="1"/>    

正如你所说的标准输出是......

println groovy.xml.DOMBuilder.newInstance().foo(bar: null, baz: 1)
//<?xml version="1.0" encoding="UTF-8"?>
//<foo bar="" baz="1"/>
于 2011-02-18T17:49:20.833 回答