转义Grails会使XML构建器命名冲突

时间:2011-12-26 19:58:07

标签: grails groovy

例如:

def list = {
    books = Book.findAll(...)
    render(contentType: 'text/xml') {
        books(count: books.size()) {
            for(book in books) {
                book(id: book.id) {
                    title(book.title)
                }
            }
        }
    }
}

使用booksbook作为节点会导致命名冲突。我知道我可以重命名所有内容以防止出现问题,但有没有办法转义节点以防止问题并保持一个干净的命名约定?

2 个答案:

答案 0 :(得分:4)

Hubert Klein Ikkink发布了一个博客条目,其中包含备用解决方案:

Groovy Goodness: Solve Naming Conflicts with Builders

他建议将delegate添加到节点名称中,以便示例变为:

def list = {
    books = Book.findAll(...)
    render(contentType: 'text/xml') {
        delegate.books(count: books.size()) {
            for(book in books) {
                delegate.book(id: book.id) {
                    title(book.title)
                }
            }
        }
    }
}

答案 1 :(得分:3)

引用冲突的节点生成术语:

 'books'(count: books.size()) {

或使用其他本地变量名称。