2014-09-04 704 views
0

我有如下的响应,其中包含两个列表。第一个列表是FILE_SET第二个列表是FILE_LIST。我想循环并返回第二个列表 FILE_LIST。我试图用下面的代码做到这一点,但它只返回第一个列表FILE_SET。我怎么能在groovy或Java循环,并返回第二个列表?循环遍历两个XML列表

XML响应

<FILE_SET_LIST> 
    <FILE_SET> 
     <FILE_LIST> 
      <FILE> 
       <DATETIME>2013-06-07T00:00:00+02:00</DATETIME> 
       <FILE_ID>W123</FILE_ID> 
       <FILE_TYPE>Doc</FILE_TYPE> 
       </FILE> 
      <FILE> 
       <DATETIME>2013-06-07T00:00:00+02:00</DATETIME> 
       <FILE_ID>W125</FILE_ID> 
       <FILE_TYPE>Letter</FILE_TYPE> 
      </FILE> 
     </FILE_LIST> 
    </FILE_SET> 
</FILE_SET_LIST> 

我的代码

response.FILESETLIST?.FILESETS?.collect() { 

      it.FILELIST?.FILES?.collect() { 
       FILE file = new FILE() 

       file.FileId = it.FILEID 
       file.Date = it.CREATIONDATETIME 
       file.FileType = it.FILETYPE 

       file 
      } 
     } 
+0

下面是一个例子:http://groovyconsole.appspot.com/script/5736754531270656 – 2014-09-04 17:43:50

回答

0

它缺少的节点的名字下划线并没有FILE类。您可以从每个FILE元素收集地图:

xml = '''<FILE_SET_LIST> 
    <FILE_SET> 
     <FILE_LIST> 
      <FILE> 
       <DATETIME>2013-06-07T00:00:00+02:00</DATETIME> 
       <FILE_ID>W123</FILE_ID> 
       <FILE_TYPE>Doc</FILE_TYPE> 
      </FILE> 
      <FILE> 
       <DATETIME>2013-06-07T00:00:00+02:00</DATETIME> 
       <FILE_ID>W125</FILE_ID> 
       <FILE_TYPE>Letter</FILE_TYPE> 
      </FILE> 
     </FILE_LIST> 
    </FILE_SET> 
</FILE_SET_LIST>''' 

response = new XmlSlurper().parseText xml 

files = response.FILE_SET.FILE_LIST.FILE.collect { file -> 
    return [ 
    fileType: file.FILE_TYPE, 
    fileId: file.FILE_ID, 
    dateTime: file.DATETIME 
    ] 
} 

assert files.size() == 2 
assert files[0].fileType == 'Doc' 
assert files[1].fileId == 'W125' 
+0

由于它的作品! – mesut 2014-09-05 14:03:29

+0

@mesut,如果这个答案解决了你的问题,你应该接受它作为正确答案 – Will 2014-09-07 21:31:42