3

我正在使用 groovy 进行一些 XML 处理。具体来说,我通过 XMLParser 吸入一个 XML 文件,在内存中进行一整批处理,然后通过 MarkupBuiler 将结果数据序列化回 XML。

文件中的绝大多数数据都被传输到基于非 xml 的对象层次结构中,以便与 gui 对话并完成处理,因此这两个 XML 文件永远不会相互了解。

但是,存在一种位于源文件边缘的 XML 块,需要将其逐字复制到输出 XML 文件中,而几乎不需要处理。有没有办法可以将 XMLParser 中的节点列表交给 MarkupBuilder 并将其插入到文档中?

像这样的东西:

def builder = new MarkupBuilder()
builder.outermosttag( name: 'library') {
  someothertag( name: 'shelf' ) {

    //magically insert a nodelist of arbitrary XML from somewhere else

  }
}
4

3 回答 3

3

XmlParser 返回一个节点,我不知道有什么方法可以在不转换为 xml 字符串的情况下将其插入标记或 StreamingMarkupBuilder。

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

        }
    }
}
于 2009-10-01T01:19:07.997 回答
1

这是我在使用DOMBuilder.

def nodelist = getFromSomewhereElse()
builder.outermosttag( name: 'library') {
  someothertag( name: 'shelf' ) {
    nodelist.each{ delegate.current.appendChild(it) }
  }
}
于 2011-02-11T11:52:15.630 回答
0

我实际上并没有尝试过这个......但如果你将节点列表序列化为一个字符串,你可能能够做到这一点:

builder.yieldUnescaped(xmlString)

不过还是有点乱……

于 2009-09-30T23:59:45.413 回答