3

私はgroovyでXML処理を行っています。具体的には、XMLParser を介して XML ファイルを吸入し、メモリ内処理のバッチ全体を実行してから、結果のデータを MarkupBuiler を介して XML にシリアル化します。

ファイル内のデータの大部分は、xml ベースではないオブジェクト階層に転送されて GUI と通信し、処理が行われるため、2 つの XML ファイルが互いを認識することはありません。

ただし、ソース ファイルの端にある XML のスラッグが 1 つあります。これは、ほとんどまたはまったく処理せずに、出力 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 は Node を返しますが、xml 文字列に変換せずに Markup または 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

  }
}

この種の作業では、StreamingMarkupBuilder と共に XmlSlurper を使用する傾向があります。

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

を使用しているときに、DOMノードリストを中央に挿入する方法を次に示します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 に答える