Groovy 以XMl格式迭代API响应并收集数据
我有一个关于如何迭代XMLAPI响应和收集数据的问题 假设我得到一个XML格式的API回复。答案是这样的Groovy 以XMl格式迭代API响应并收集数据,groovy,Groovy,我有一个关于如何迭代XMLAPI响应和收集数据的问题 假设我得到一个XML格式的API回复。答案是这样的 <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <SearchRS> <SearchStatus>SUCCESS</SearchStatus> <Itinerary> <DisplayTotal>189.41
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<SearchRS>
<SearchStatus>SUCCESS</SearchStatus>
<Itinerary>
<DisplayTotal>189.41</DisplayTotal>
<FareStarProfileID>11PUB2</FareStarProfileID>
</Itinerary>
<Itinerary>
<DisplayTotal>19.41</DisplayTotal>
<FareStarProfileID>11PUB3</FareStarProfileID>
</Itinerary>
<Itinerary>
<DisplayTotal>79.11</DisplayTotal>
<FareStarProfileID>11PUB8</FareStarProfileID>
</Itinerary>
<Itinerary>
<DisplayTotal>89.61</DisplayTotal>
<FareStarProfileID>11PUB4</FareStarProfileID>
</Itinerary>
</SearchRS>
我的问题是,如果我想找出每个票价StarProfileID的最便宜的DisplayTotal怎么办?做这件事最简单的方法是什么?因此,考虑到如下一些XML:
def xmlResponse = '''<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<SearchRS>
<SearchStatus>SUCCESS</SearchStatus>
<Itinerary>
<DisplayTotal>189.41</DisplayTotal>
<FareStarProfileID>11PUB2</FareStarProfileID>
</Itinerary>
<Itinerary>
<DisplayTotal>19.41</DisplayTotal>
<FareStarProfileID>11PUB3</FareStarProfileID>
</Itinerary>
<Itinerary>
<DisplayTotal>79.11</DisplayTotal>
<FareStarProfileID>11PUB8</FareStarProfileID>
</Itinerary>
<Itinerary>
<DisplayTotal>89.61</DisplayTotal>
<FareStarProfileID>11PUB4</FareStarProfileID>
</Itinerary>
</SearchRS>'''
对于Groovy 2.0.8
在2.0.8中,您不能对NodeChildren做太多的工作,因此您必须切换到使用inject
来代替groupBy
def minTotals = doc.Itinerary
.inject([:].withDefault { [] }) { map, it ->
map[it.FareStarProfileID.text()] << it
map
}
.collectEntries { profile, nodes ->
[profile, nodes.min { it.DisplayTotal.text() as Double }]
}
def minTotals=单据行程
.inject([:].withDefault{[]}{map,it->
map[it.FareStarProfileID.text()]
[profile,nodes.min{it.DisplayTotal.text()为双精度}]
}
因此,给定一些XML,例如:
def xmlResponse = '''<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<SearchRS>
<SearchStatus>SUCCESS</SearchStatus>
<Itinerary>
<DisplayTotal>189.41</DisplayTotal>
<FareStarProfileID>11PUB2</FareStarProfileID>
</Itinerary>
<Itinerary>
<DisplayTotal>19.41</DisplayTotal>
<FareStarProfileID>11PUB3</FareStarProfileID>
</Itinerary>
<Itinerary>
<DisplayTotal>79.11</DisplayTotal>
<FareStarProfileID>11PUB8</FareStarProfileID>
</Itinerary>
<Itinerary>
<DisplayTotal>89.61</DisplayTotal>
<FareStarProfileID>11PUB4</FareStarProfileID>
</Itinerary>
</SearchRS>'''
对于Groovy 2.0.8
在2.0.8中,您不能对NodeChildren做太多的工作,因此您必须切换到使用inject
来代替groupBy
def minTotals = doc.Itinerary
.inject([:].withDefault { [] }) { map, it ->
map[it.FareStarProfileID.text()] << it
map
}
.collectEntries { profile, nodes ->
[profile, nodes.min { it.DisplayTotal.text() as Double }]
}
def minTotals=单据行程
.inject([:].withDefault{[]}{map,it->
map[it.FareStarProfileID.text()]
[profile,nodes.min{it.DisplayTotal.text()为双精度}]
}
如果我将其应用于我的代码,我会得到以下错误:groovy.util.slurpersupport.NodeChildren.groupBy()方法的签名不适用于参数types@Sulteric,在将其应用于xml之前,您是否尝试过该解决方案?该代码根本无法工作,它在运行时总是失败,我在网上找不到任何可以与之比较的例子。对我来说很有用。。。你在运行什么?Initellij 2017.1.5,Grails 2.2.5,Java版本是1.7如果我将其应用于我的代码,我会得到以下错误:没有方法签名:groovy.util.slurpersupport.NodeChildren.groupBy()适用于参数types@Sulteric,在将其应用于xml之前,您是否尝试过该解决方案?该代码根本无法工作,它在运行时总是失败,我在网上找不到任何可以与之比较的例子。对我来说很有用。。。你在运行什么?Initellij 2017.1.5,Grails 2.2.5,Java版本是1.7