我可以将groovy的markupbuilder交给节点列表吗?

时间:2009-09-30 23:48:58

标签: xml groovy nodelist markupbuilder

我正在使用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

  }
}

3 个答案:

答案 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)
但是仍然有点凌乱......