我想用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”等。
1条答案
按热度按时间nvbavucw1#
这是代码中的函数调用:
并且在标记构造器中函数名变为标签名。
在groovy中,可以通过动态名称调用函数,使用插值字符串代替函数名称: