使用XMLSlurper从RESTClient查找XML元素

时间:2010-12-09 12:55:48

标签: xml groovy xmlslurper httpbuilder

我正在编写一个Spock测试,其中我有一个REST Web服务,它返回一个这样的XML:

<templates>
 <userTemplate id="1109">
  <settingsXml/>
  <type>USER</type>
  <label>template111</label>
  <description>template111</description>
 </userTemplate>
 <userTemplate id="1141" isAutomaticTemplate="true">
     <settingsXml/>
  <type>USER</type>
  <label>An updated user template</label>
 </userTemplate>
</templates>

我的测试想要验证特定用户模板在本文档中不是。因此,使用HTTP Builder的REST客户端和XMLSlurper,我正在执行以下操作:

   res = settingsService.get(path: "templates")
   res.status == 200
   def delTemplate = res.data.userTemplate.find {
    println it.@id == newUserTemplateId
    it.@id == newUserTemplateId
   }
   delTemplate

我会认为 delTemplate 在调用 find 后会为null(因为没有带有该id的模板; expresion println it。@ id == newUserTemplateId始终打印 false ,在这种情况下, newUserTemplateId 的值为1171)。
但是, delTemplate 的类型为groovy.util.slurpersupport.NoChildren,它似乎包含一个userTemplate元素。

有趣的是,如果我使用与文本相同的XML编写快速脚本(与从REST中读取它相反),res.userTemplate.find { it.@id == 1171 }将按预期返回null。

我做错了什么,或者我怎么能解决这个问题?

1 个答案:

答案 0 :(得分:2)

我使用带有XMLSlurper的httpBuilder进行其余web服务的JUnit测试。有一个问题是,GPathResult上的find()总是返回另一个GPathResult - 但是这可能不包含子项。

对于您的特定用例,我使用的习语是:

def resp = settingsService.get(path: 'templates')
assert resp.success
assert resp.data.userTemplate.find {it.@id == newUserTemplateId}.isEmpty()