在Groovy XML中将搜索限制为同级?
我有以下形式的XML,我正在使用XmlSlurper进行解析:在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<
<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
。我必须在闭包中进行一些条件选择,但效果非常好!