在Groovy XML中将搜索限制为同级?

在Groovy XML中将搜索限制为同级?,xml,groovy,Xml,Groovy,我有以下形式的XML,我正在使用XmlSlurper进行解析: <results> <result> <binding name="key"> <uri>http://key/key1</uri> </binding> <binding name="value"> <literal>Value 1 for key 1<

我有以下形式的XML,我正在使用XmlSlurper进行解析:

  <results>
    <result>
      <binding name="key">
        <uri>http://key/key1</uri>
      </binding>
      <binding name="value">
        <literal>Value 1 for key 1</literal>
      </binding>
    </result>
    <result>
      <binding name="key">
        <uri>http://key/key2</uri>
      </binding>
      <binding name="value">
        <literal>Value 1 for key 2</literal>
      </binding>
    </result>
    <result>
      <binding name="key">
        <uri>http://key/key1</uri>
      </binding>
      <binding name="value">
        <literal>Value 2 for key 1</literal>
      </binding>
    </result>
    <result>
      <binding name="key">
        <uri>http://key/key2</uri>
      </binding>
      <binding name="value">
        <literal>Value 2 for key 2</literal>
      </binding>
    </result>
  </results>

http://key/key1
键1的值1
http://key/key2
键2的值1
http://key/key1
键1的值2
http://key/key2
键2的值2

请注意,每个键(可能)有多个值。我想从本质上提取一个键->[值列表]的多重映射。对我来说,实现这一目标的最佳方式是什么?我熟悉基本的GPath构造,我认为某种形式的
groupBy{}.collectEntries{}
可能是合适的,但我似乎找不到正确的答案。

假设xml存储在字符串变量
x
中,一种方法是:

def map = new XmlSlurper().parseText( x ).result.inject( [:].withDefault{ [] } ) { m, e ->
    m[ e.binding.uri.text() ] << e.binding.literal.text()
    m
}
defmap=newxmlslurper().parseText(x).result.inject([:].withDefault{[]}){m,e->

m[e.binding.uri.text()]这绝对是正确的工具-我以前从未使用过
inject
。我必须在闭包中进行一些条件选择,但效果非常好!