4

我了解如何使用 MarkupBuilder 在 Groovy 中创建 XML。在初始创建后如何将元素添加/插入到 MarkupBuilder 对象中?例如,从以下开始:

def builder = new MarkupBuilder(writer)
  def items = builder.items{
        item(name: "book")
  }

这会产生:

<items> 
   <item name="book/> 
 </items>

我正在尝试创建一个可扩展的基本 XML 消息,使用核心类来包装构建器和继承以添加特定标签。基于上面的例子,这是我的基类:

Class ItemBuilder{
   def name;
   def builder = new MarkupBuilder(writer)
   public Object getXML(){
     def items = builder.items{
            item(name: this.name)
      }
     return items;
   }
}

这是一个示例扩展消息构建器:

Class SubItemBuilder extends ItemBuilder{
       def type;

       public Object getXML(){
         def items = super.getXML();
         //do something here to add a subitem child tag....
         return items;
       }
    }

如果我在 JavaScript 中使用 JSON,我会执行以下操作:

items.item.subitem = "foo"

我最终希望 SubItemBuilder.getXML 生成:

<items> 
     <item name="book>
       <subitem type="paperback"/>
      </item>
 </items>

有没有简单的方法来实现这一点?似乎一种选择是继承 MarkupBuilder 并添加公共方法来插入子节点。有没有更好的方法来实现我正在寻找的结果?

4

2 回答 2

7

使用MarkupBuilder 进行敏捷 XML 创建的食谱示例展示了如何创建接近我需要的东西。

例如:

import groovy.xml.MarkupBuilder

def writer = new StringWriter()
def builder = new MarkupBuilder(writer)  

def subitem (builder){
    builder.subitem(type: "paperback")
}


def items = builder.items{
    item(name: "book")
    subitem(builder)
}

println writer.toString()​
于 2012-02-26T16:05:24.227 回答
3

我不知道答案,但我建议您重组尝试。

通常,要么 (a) 在创建构建器时知道所有输出,要么 (b) 程序在构建器的闭包范围内运行。我还没有看到将构建器用作文档本身。

还有另一种选择:StreamingMarkupBuilder。此类在将文档移交给编写者(即异步)之前不会构造文档。它还使得从多个来源构建文档变得更加容易,如下所示:

import groovy.xml.*

def builder = new StreamingMarkupBuilder()

def item1 = { item(name:'book') }
def item2 = { item(name:'mag') }

def doc = { 
    "items" {
        out << item1
        out << item2
    }
}

println builder.bind(doc)

>>> <items><item name='book'/><item name='mag'/></items>

我不认为这会解决你的问题。你能用更多的范围重新表述这个问题吗?那样的话,我们或许能够看到更大的图景是否存在哲学问题。

于 2009-09-24T02:19:27.427 回答