如何为数据表编写DSL,类似于Spock?

时间:2014-12-08 14:28:05

标签: groovy

我见过spock,它接受这种语法(所谓的数据表):

    a | b | c
    1 | 3 | 3
    7 | 4 | 4
    0 | 0 | 0

让我们在data_table.groovy中说,如何编写DSL以便将上述内容转换为每行的xml:

<a>1</a>
<b>3</b>
<c>3</c>
... other rows

提前致谢。

1 个答案:

答案 0 :(得分:1)

您可以使用GroovyTables(免责声明:我是GroovyTables的作者)

  1. 创建一个接受闭包参数的方法,使用GroovyTables构造数组列表,然后循环遍历表以创建XML:

    my.cnf
  2. 然后使用您的新方法:

    private String toXml(Closure closure) {
        List<Object[]> rows = GroovyTables.createListOfArrays(closure)
        Iterator<Object[]> rowsIterator = rows.iterator()
        Object[] headingRow = rowsIterator.next()
        StringBuilder sb = new StringBuilder()
        while (rowsIterator.hasNext()) {
            Object[] row = rowsIterator.next()
            sb.append("<row>\n")
            for (int i = 0; i < row.length; i++) {
                sb.append("    <${headingRow[i].name}>${row[i]}</${headingRow[i].name}>\n")
            }
            sb.append("</row>\n")
        }
        return sb.toString()
    }
    

    将产生:

    def xml = toXml {
        a | b | c
        1 | 3 | 3
        7 | 4 | 4
        0 | 0 | 0
    }
    println xml