Groovy闭包上的条件取出元素

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") }

我正在使用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 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"
    }
}