【问题标题】:How to write DSL for data tables, similar to Spock?如何为数据表编写DSL,类似于Spock?
【发布时间】:2014-12-08 14:28:04
【问题描述】:

我见过 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

提前致谢。

【问题讨论】:

  • 输入到底是什么?数据表是字符串还是单行?
  • 只有第一行?你试过什么了? 3&gt; 是错字吗?
  • 不,它本身就是 groovy,我想为它编写 DSL 解析器。这样用户就可以写这样的东西,解析器将转换为 xml。
  • 这几乎不能称为 DSL。这只是格式化的数据。你需要一些公式吗?或者为什么这必须是一个 groovy 文件?
  • 原因是,为什么它需要在groovy文件中,最终用户将直接将它们写入groovy文件。我不希望他们写成字符串。而是直接在 groovy 中编写代码!

标签: groovy


【解决方案1】:

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

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

    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()
    }
    
  2. 然后使用你的新方法:

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

    将产生:

    <row>
        <a>1</a>
        <b>3</b>
        <c>3</c>
    </row>
    <row>
        <a>7</a>
        <b>4</b>
        <c>4</c>
    </row>
    <row>
        <a>0</a>
        <b>0</b>
        <c>0</c>
    </row>
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-09
    • 2016-08-27
    • 1970-01-01
    • 2012-06-06
    • 2012-10-30
    • 2010-12-13
    • 1970-01-01
    相关资源
    最近更新 更多