Groovy闭包上的条件取出元素
我正在使用Groovy库调用ws-lite进行web服务测试。它的工作方式是接受闭包并生成XML并将其发送到web服务端点 有关此闭包的简单示例,请参见下文:Groovy闭包上的条件取出元素,groovy,Groovy,我正在使用Groovy库调用ws-lite进行web服务测试。它的工作方式是接受闭包并生成XML并将其发送到web服务端点 有关此闭包的简单示例,请参见下文: def bookXml = { books { book(available: "20", id: "1") { title("Don Xijote") author(id: "1", "Manuel De Cervantes") }
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 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和Collectfor list来实现这一点,但我对转换闭包知之甚少
你能和我分享一些见解吗
谢谢。我对构建器不太了解,但问题似乎在于如何忽略映射中的键将为空值 这可以通过使用带有两个arg闭包的
each()
方法来实现。在本例中,传递给闭包的两个参数将是每个条目的键和值
展示-
def book = [
id : "1",
available: "20",
title : null
]
book.each {key, value->
if (value) {
println "$key->$value"
}
}
我非常怀疑你能用一种简单的方式做你想做的事。如果您不熟悉ASTs,那么闭包就不是一种可以轻松操作的数据结构
在我看来,在将输入映射传递到
bookXml
之前,应该使其保持一致。除此之外,请坚持@divelhpremdeep-answer。如果(it.title){title:it.title},您是否尝试过if(it.title)
?这是我目前的方法:)。但我的xml树实际上相当大,很多标记都是可选的,我不想把它们中的每一个都放在if语句中。只是在想是否有一种更可重复使用的方法?这里你几乎没有什么错<代码>标题:“Don Xijote”不会添加元素,标题(“Don Xijote”)
会添加元素。其次,映射的结构不正确,book
应该是一个数组/列表,而它是一个具有重复键的映射book
。这些问题都与问题无关。对不起,我倾向于起草糟糕的示例:),更新了问题。
def book = [
id : "1",
available: "20",
title : null
]
book.each {key, value->
if (value) {
println "$key->$value"
}
}