我正在使用Groovy库调用ws-lite进行Web服务测试。它的工作方式是关闭并生成XML并将其发送到Web服务端点。
请参阅下文,了解此闭包的简单示例:
def bookXml = {
books {
book(available: "20", id: "1") {
title("Don Xijote")
author(id: "1", "Manuel De Cervantes")
}
book(available: "14", id: "2") {
title("Catcher in the Rye")
author(id: "2", "JD Salinger")
}
book(available: "13", id: "3") {
title("Alice in Wonderland")
author(id: "3", "Lewis Carroll")
}
}
}
将在请求中生成XML,如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<books>
<book available="20" id="1">
<title>Don Xijote</title>
<author id="1">Manuel De Cervantes</author>
</book>
<book available="14" id="2">
<title>Catcher in the Rye</title>
<author id="2">JD Salinger</author>
</book>
<book available="13" id="3">
<title>Alice in Wonderland</title>
<author id="3">Lewis Carroll</author>
</book>
</books>
为了让我的客户更灵活,我通常会将测试中的数据结构作为地图传递给客户端:
def bookMap = [
books: [[
id : "1",
available: "20",
title : "Don Xijote",
author : [
id : "1",
name: "Manuel De Cervantes"
]
], [
id : "2",
available: "14",
title : "Catcher in the Rye",
author : [
id : "2",
name: "JD Salinger"
]
], [
id : "3",
available: "13",
title : "Alice in Wonderland",
author : [
id : "3",
name: "Lewis Carroll"
]
]
]
这就是客户现在的样子:
def bookXml = {
books {
bookMap.books.book.each {
book(available: it.available, id: it.id) {
title(it.available.title)
author(id: it.author.id, it.author.name)
}
}
}
}
我想做的一件事是在bookXml闭包中,如果我的数据结构中的值为null,有没有办法可以取出标记?
例如,如果我的第一本书的标题在地图中为空,那么在闭包中,它不会为第一本书创建此标签标题。
我知道如何在groovy集合中使用collectentries for map和collect for list,但我对转换闭包知之甚少。
请与我分享一些见解?
感谢。
答案 0 :(得分:0)
我对构建器知之甚少,但似乎问题是如何忽略键会使地图中的值为空。
这可以通过使用带有两个arg闭包的each()
方法来实现。在这种情况下传递给闭包的两个参数将是每个条目的键和值。
演示 -
def book = [
id : "1",
available: "20",
title : null
]
book.each {key, value->
if (value) {
println "$key->$value"
}
}
答案 1 :(得分:0)
我非常怀疑你能以简单的方式做你想做的事。如果你没有进入AST,那么闭包不是一个你可以轻松操作的数据结构。
IMO,您应该在将输入地图传递给bookXml
之前使其保持一致。除此之外,坚持@diveshpremdeep回答。