2009-09-30 2 views
3

groovy로 XML 처리를하고 있습니다. 특히 XMLParser를 통해 XML 파일을 흡입하고 전체 메모리 처리 작업을 수행 한 다음 결과 데이터를 MarkupBuiler를 통해 XML로 직렬화합니다.groovy의 마크 업 작성기에 노드 목록을 넘길 수 있습니까?

파일의 대다수가 비 xml 기반 개체 계층 구조로 전송되어 gui와 대화하고 처리가 완료되어 두 XML 파일이 서로를 알지 못합니다.

그러나 소스 파일의 가장자리에있는 XML 슬래그가 하나 있으며 처리가 거의 또는 전혀없이 출력 XML 파일에 그대로 복사해야합니다. MarkupBuilder에 XMLParser의 노드리스트를 넘겨주고 문서에 삽입하는 방법이 있습니까? 이 같은

뭔가 :

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

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

    } 
} 

답변

0

는 사실이 시도하지 않은 ...하지만 당신은 문자열로 노드 목록을 직렬화하는 경우이 할 수 있습니다 아직

builder.yieldUnescaped(xmlString) 

을 다소 복잡하지만 ...

3

XmlParser는 노드를 반환하며 XML 문자열로 변환하지 않고 Markup 또는 StreamingMarkupBuilder에 삽입하는 방법을 알지 못합니다. 나는 StreamingMarkupBuilder와 함께 XmlSlurper 사용하는 경향이 이런 종류의 일을 위해

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 

    } 
} 

: 여기

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

DOMBuilder를 사용하는 동안 내가 중간에 DOM 노드 목록을 삽입 할 수있는 방법입니다.

def nodelist = getFromSomewhereElse() 
builder.outermosttag(name: 'library') { 
    someothertag(name: 'shelf') { 
    nodelist.each{ delegate.current.appendChild(it) } 
    } 
}