我正在使用groovy进行一些XML处理。具体来说,我通过XMLParser吸入XML文件,进行一整堆内存处理,然后通过MarkupBuiler将结果数据序列化为XML。
文件中的绝大多数数据都会传输到非基于xml的对象层次结构,以便与gui通信并完成处理,因此这两个XML文件永远不会相互了解。
但是,有一个XML版本位于源文件的边缘,需要逐字复制到输出XML文件,几乎不需要处理。有没有办法让MarkupBuilder从XMLParser中获取一个nodelist并将其插入到文档中?
这样的事情:
def builder = new MarkupBuilder()
builder.outermosttag( name: 'library') {
someothertag( name: 'shelf' ) {
//magically insert a nodelist of arbitrary XML from somewhere else
}
}
答案 0 :(得分:3)
XmlParser返回一个Node,我不知道如何将其插入Markup或StreamingMarkupBuilder而不转换为xml字符串。
import groovy.xml.*
def x = """
<root>
<somenode1>
<anode>foo</anode>
</somenode1>
<somenode2>
<anode>bar</anode>
</somenode2>
</root>
""".trim()
def otherXml = new XmlParser().parseText(x)
def writer = new StringWriter()
new XmlNodePrinter(new PrintWriter(writer)).print(otherXml.somenode1[0])
def builder = new MarkupBuilder()
builder.outermosttag( name: 'library') {
someothertag( name: 'shelf' ) {
mkp.yieldUnescaped writer.toString() //magically insert a nodelist of arbitrary XML from somewhere else
}
}
对于这种工作,我倾向于使用XmlSlurper和StreamingMarkupBuilder:
import groovy.xml.*
def x = """
<root>
<somenode1>
<anode>foo</anode>
</somenode1>
<somenode2>
<anode>bar</anode>
</somenode2>
</root>
""".trim()
def otherXml = new XmlSlurper().parseText(x)
def builder = new StreamingMarkupBuilder().bind {
outermosttag( name: 'library') {
someothertag( name: 'shelf' ) {
mkp.yield otherXml.somenode1 //magically insert a nodelist of arbitrary XML from somewhere else
}
}
}
答案 1 :(得分:1)
以下是我在使用DOMBuilder
时在中间插入DOM节点列表的方法。
def nodelist = getFromSomewhereElse()
builder.outermosttag( name: 'library') {
someothertag( name: 'shelf' ) {
nodelist.each{ delegate.current.appendChild(it) }
}
}
答案 2 :(得分:0)
我还没有尝试过这个...但是如果你将nodelist序列化为一个字符串,你可以这样做:
builder.yieldUnescaped(xmlString)
但是仍然有点凌乱......