使用groovy DOMBuilder忽略空属性

使用groovy DOMBuilder忽略空属性,dom,groovy,markupbuilder,Dom,Groovy,Markupbuilder,Groovy有一个ompitNullAttributes和一个ompitEmptyAttributes。但事实并非如此。这是我的密码 >>> def xml = DOMBuilder.newInstance() >>> def maybeEmpty = null >>> println xml.foo(bar: maybeEmpty) <foo bar=""/> def xml=DOMBuilder.newInstance()

Groovy有一个
ompitNullAttributes
和一个
ompitEmptyAttributes
。但事实并非如此。这是我的密码

>>> def xml = DOMBuilder.newInstance()
>>> def maybeEmpty = null
>>> println xml.foo(bar: maybeEmpty)
<foo bar=""/>
def xml=DOMBuilder.newInstance() >>>def maybeEmpty=null >>>println xml.foo(bar:maybeEmpty)
如果是空的,我希望
被省略。我在回答
findAll
empty属性时找到了一个解决方法,并将其删除。因为我要生成一个复杂的DOM,所以我正在寻找其他选项。

我相信没有内置的选项,但是如果您需要一个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"/>    
def factory=groovy.xml.FactorySupport.createDocumentBuilderFactory().newDocumentBuilder()
def builder=新的DOMBuilderSubclass(工厂)
println builder.foo(bar:null,baz:1)
//
//    
正如你所说的标准输出是

println groovy.xml.DOMBuilder.newInstance().foo(bar: null, baz: 1)
//<?xml version="1.0" encoding="UTF-8"?>
//<foo bar="" baz="1"/>
println groovy.xml.domguilder.newInstance().foo(bar:null,baz:1)
//
//