我理解如何使用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并添加公共方法来插入子节点。有没有更好的方法来实现我正在寻找的结果?
答案 0 :(得分:7)
使用MarkupBuilder for Agile XML Creation的食谱示例显示了如何创建接近我需要的东西。
例如:
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()
答案 1 :(得分:3)
我不知道答案,但我建议您重新尝试。
通常,(a)所有输出在创建构建器时都是已知的,或者(b)程序在构建器的闭包范围内运行。我没有看到过用作文档的构建器。
还有另外一个选项:StreamingMarkupBuilder。该类在传递给编写器(即异步)之前不构造doc。它还可以更轻松地从多个来源构建文档,如下所示:
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>
我不认为这会解决你的问题。你能用更多的范围来重新解释这个问题吗?这样,我们就可以看到更大的图片是否存在哲学问题。