Groovy 以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

我有一个关于如何迭代XMLAPI响应和收集数据的问题

假设我得到一个XML格式的API回复。答案是这样的

 <?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