【问题标题】:Groovy MarkupBuilderGroovy 标记生成器
【发布时间】:2014-05-06 06:43:47
【问题描述】:

我有一个东西列表,每一个都可能是 foo 或 bar。我想构建一些看起来像这样的 xml:

<rdf:RDF>
  <foo id="1">
  <foo id="2">
  <bar id="3">
</rdf:RDF>

所以我已经走到这一步了:

MarkupBuilder xml = new MarkupBuilder(writer)
  xml.'rdf:RDF' (nsmap) { }

但现在我被困住了。我如何 - 在 xml.'rdf:RDF' (nsmap) { } 闭包中 - 遍历我的内容列表?我如何 - 在该迭代器中 - 吐出适用的 foo 或 bar 元素?

【问题讨论】:

    标签: groovy markupbuilder


    【解决方案1】:

    如您所想,它更简单。在 xml 闭包中包含一个循环,然后在循环中包含标记。这个脚本...

    import groovy.xml.MarkupBuilder
    
    things = ['foo','foo','bar']
    writer = new StringWriter()
    
    xml = new MarkupBuilder(writer)
    xml.'rdf:RDF' {
        things.eachWithIndex {thing,index ->
            "$thing" id:index+1
        }
    }
    
    println writer
    

    ... 将产生以下输出:

    <rdf:RDF>
      <foo id='1' />
      <foo id='2' />
      <bar id='3' />
    </rdf:RDF>
    

    【讨论】:

      【解决方案2】:

      给你:

      import groovy.xml.MarkupBuilder
      import org.custommonkey.xmlunit.*
      
      def data = [foo:1,bar:2,baz:3]
      
      def writer = new StringWriter()
      def xml = new MarkupBuilder(writer)
      xml.'rdf:RDF' {
          data.each { e ->
              "$e.key"(id:e.value)
          }
      }
      println writer
      

      【讨论】:

      • 谢谢,但问题是元素可能很大,需要一种方法来做——它们不像我的玩具例子那么简单。
      • :) 好的,然后粘贴一个完整的工作示例来很好地说明问题。
      【解决方案3】:

      好的。

      问题在于,当构建器运行闭包时,它会在构建器的上下文中运行。现在,事实证明构建器上下文隐藏了方法,但没有隐藏变量。这意味着您可以创建一个闭包,将其分配给一个变量,然后从构建器中访问它。

      现在,我的印象是这个闭包也运行在构建器的上下文中。但我怀疑您可以将“this”分配给闭包之外的变量,然后访问该变量以获取上下文。

      你不得不遇到这种麻烦,这太荒谬了。我想起了 90 年代 Microsoft Access 中的编码。它非常有效,直到您想要做的事情超出了严格设计的范围。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-12-26
        • 2010-12-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多