使用 groovy DOMBuilder 省略空属性

发布于 2024-10-17 15:59:05 字数 773 浏览 4 评论 0原文

Groovy 的 MarkupBuilder 有一个 omitNullAttributes 和一个省略EmptyAttributes。但 DOMBuilder 没有。这是我的代码,

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

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

Groovy's MarkupBuilder has an omitNullAttributes and an omitEmptyAttributes. But DOMBuilder doesn't. This is the code I have

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

I want bar to be omitted if empty. I found a workaround in an answer to Groovy AntBuilder, omit conditional attributes... to findAll empty attributes and remove them. Since I have a complex DOM to be generated, I'm looking for other options.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

自演自醉 2024-10-24 15:59:05

我相信没有内置选项,但如果您需要 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"/>

I believe there is no built-in option for that, but if you need a DOMBuilder, you could subclass it and filter the attributes...

@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}
     }
}

You might want to tune the construction as in standard DOMBuilder, this is just an example.

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"/>    

standard output as you said was...

println groovy.xml.DOMBuilder.newInstance().foo(bar: null, baz: 1)
//<?xml version="1.0" encoding="UTF-8"?>
//<foo bar="" baz="1"/>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文