Groovy Markup-Builder使用动态节点名

vwoqyblh  于 2023-03-01  发布在  其他
关注(0)|答案(1)|浏览(113)

我想用Groovy中的Markup-Builder创建一个XML,我的程序中有以下XML:

<root>
    <row>
        <first-name>Max</first-name>
        <last-name>Mustermann</last-name>
        <DEUcountry>DEU</DEUcountry>
        <DEUgenericString1>Generic-1 DEU</DEUgenericString1>
        <DEUgenericString2>Generic-2 DEU</DEUgenericString2>
    </row>
    <row>
        <first-name>Marlene</first-name>
        <last-name>Musterfrau</last-name>
        <USAcountry>USA</USAcountry>
        <USAgenericString1>Generic-1 USA</USAgenericString1>
        <USAgenericString2>Generic-2 USA</USAgenericString2>
    </row>
</root>

我想输出这样的内容:

<root>
  <row>
    <D>Max</D>
    <D>Mustermann</D>
    <D>2000-01-01</D>
    <localcountry country='DEU'>DEU</localcountry>
    <localgenericString1 country='DEU'>Generic-1 DEU</localgenericString1>
    <localgenericString2 country='DEU'>Generic-2 DEU</localgenericString2>
  </row>
  <row>
    <D>Marlene</D>
    <D>Musterfrau</D>
    <D>2001-12-31</D>
    <localcountry country='USA'>USA</localcountry >
    <localgenericString1 country='USA'>Generic-1 USA</localgenericString1>
    <localgenericString2 country='USA'>Generic-2 USA</localgenericString2>
  </row>
</root>

实际上,我是通过一个简单的子字符串(0,3)来计算国家的,但是我不明白的是,在Markup-Builder中使用一个动态名称来构建“localcountry”。
我目前的编码:

def writer = new StringWriter()
def builder = new MarkupBuilder(writer)
        
        builder.root{
            _root.row.each{_row ->
                row{
                    _row.childNodes().each{_node ->
                        if (_node.name().substring(0,3) == _node.name().substring(0,3).toUpperCase() &&
                            _node.text() != ""){
                            localized([country: _node.name().substring(0,3)],_node.text()){}
                        }else if (_node.name().substring(0,3) != _node.name().substring(0,3).toUpperCase()){
                            D(_node.text()){                  
                            }
                        }               
                    }
                }
            }
        }

        return writer.toString()

因此输出如下:

<row>
    <D>Marlene</D>
    <D>Musterfrau</D>
    <D>2001-12-31</D>
    <localized country='USA'>USA</localized>
    <localized country='USA'>Generic-1 USA</localized>
    <localized country='USA'>Generic-2 USA</localized>
</row>

我不明白如何根据_节点将“本地化”变为动态的“localcountry”、“localgenericString 1”等。

nvbavucw

nvbavucw1#

这是代码中的函数调用:

localized ([country: _node.name().substring(0,3)],_node.text()) {}

并且在标记构造器中函数名变为标签名。
在groovy中,可以通过动态名称调用函数,使用插值字符串代替函数名称:

"local${_node.name().substring(3)}" (...) {}

相关问题