Groovy xml用重复键映射

时间:2016-06-06 12:36:48

标签: xml dictionary groovy

我需要使用groovy来转换具有相同键的XML

 <Root>
    <firstname>abc </firstname>
    <firstname>bcd </firstname>
    <lastname>abf </lastname>     
</Root>

为了映射,我希望有类似的东西:

[firstname:{"abc , bcd"} , lastname:"abf"]

提前致谢!!

1 个答案:

答案 0 :(得分:1)

可能有很多方法可以做到这一点。假设你的xml只有一个级别(如你的例子中所示),你可以这样做:

def xml = '''<Root>
    <firstname>abc </firstname>
    <firstname>bcd </firstname>
    <lastname>abf </lastname>     
</Root>'''

new XmlSlurper().parseText(xml)
    .children()
    .groupBy { it.name() }
    .collectEntries { k, v -> [k, v*.text()*.trim().join(', ')] }

如果您的xml更深,那么问题很快变得非常重要,您将不得不做出一些关于您要做什么的决定...... XML可以容纳比地图更多的数据

修改

所以你可以尝试这样的事情来进行更加随意的处理:

给出表格中的xml:

def xml = '''<Root>
    <firstname>abc </firstname>
    <firstname>bcd </firstname>
    <lastname>abf </lastname>  
    <adresse> <ville>aaa</ville><ville>eeee</ville><pays>ffff</pays></adresse>   
</Root>'''

然后用:

处理它
new XmlSlurper().parseText(xml).with { node ->
    node.children()
        .groupBy { it.name() }
        .collectEntries { k, v ->
            [k, v.any { it.children().size() } ?
                    v.collect(owner) :
                    v*.text()*.trim().join(', ')]
        }
} 

应该给你输出:

['firstname':'abc, bcd', 'lastname':'abf', 'adresse':[['ville':'aaa, eeee', 'pays':'ffff']]]