Опускать пустые атрибуты с помощью заводного DOMBuilder - PullRequest
2 голосов
/ 17 февраля 2011

Groovy's MarkupBuilder имеет omitNullAttributes и omitEmptyAttributes. Но DOMBuilder этого не делает. Это код, который у меня есть

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

Я хочу, чтобы значение bar было опущено, если оно пустое. Я нашел обходной путь в ответе Groovy AntBuilder, пропустил условные атрибуты ... до findAll пустые атрибуты и удалил их. Так как у меня есть сложный DOM для генерации, я ищу другие варианты.

1 Ответ

2 голосов
/ 18 февраля 2011

Я считаю, что для этого нет встроенной опции, но если вам нужен 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"/>
...