2012-05-06 2 views
1

StreamingMarkupBuilder()가 비 XML을 생성하는 이유를 알아 내려고하고 있습니다. 우리가 거기에 도착하는 방법Groovy StreamingMarkupBuilder() non-XML 생성

public static void saveXMLToFile(def document, String file) { 
    def xmlBuilder = new StreamingMarkupBuilder().bind { 
     mkp.xmlDeclaration() 
     mkp.yield document 
    } 
    new File(file).withWriter { out -> 
     out << xmlBuilder 
    } 
} 

그리고 여기 : 여기에 내가 전화 했어 방법

def document = new XmlParser(false, false).parse(manuscriptFile) 
if (document.name().equals("appendix")) { 
    def newNode = new groovy.util.Node(null, "chapter", document.attributes(), 
             document.value()) 
    XMLUtils.saveXMLToFile(newNode, manuscriptFile) 
} 

하지만 그 대신 XML을 얻는의를 내가 얻을 : 내가 해봤

<?xml version='1.0'?> 
title[attributes={id=_2140_5145_361}; value=[An introduction to blah]]partintro 
[attributes={id=_2140_5145_362}; value=[para[attributes={id=_2140_5145_363}; value=[My 
contents, blah blah blah]]] 

워드 프로세서,하지만 불행하게도 나는 그루비를 대단히 좋아하지 않는다. 그래서 나는 간단한 것을 놓치고 있다고 확신한다. :(사전에

감사합니다 ...

답변

7

, 보인다, 슬프게도, 아주 잘 설명되어 있지 않습니다 XmlUtil 클래스를 사용하고 그것을하는 가장 쉬운 방법 :

def saveXMLToFile(Node document, String file) { 
    new File(file).withWriter { out -> 
     XmlUtil.serialize(document, out) 
    } 
} 

(통지 내가 발견 한 문제가 MarkupBuilder가을 반환 groovy.xml.MarkupBuilder (또는 StreamingMarkupBuilder) 및 groovy.util.Node, 는 얻을 수가 없다는 것입니다

) 노드를받을 수있는 방법 서명을 변경하는 것이 함께 잘. 적어도 노드에 XML 선언을 추가하는 방법을 찾을 수 없으므로 XmlNodePrinter으로 인쇄 할 수 있습니다. MarkupBuilder 클로저에 노드를 추가하는 것입니다.이 작업은 쉽고 쉬워야합니다. 누구든지 이러한 작업을 수행하는 방법을 알고 있다면 주석에 설명하거나 새 대답을 추가하십시오. D

이렇게 쉽게 문서화되지 않은 XmlUtil의 마법에 의존하지 않고도 두 번째로 쉬운 해결책은 첫째 StreamingMarkupBuilder 사용하여 XML 선언과 (심지어 MarkupBuilder을, 그것이 우리가이 경우 원하지 않는 루트 노드 선언을 필요로 보인다) 다음 XmlNodePrinter를 사용하여 문서를 인쇄 :

첫 번째 솔루션은 아름답게 일
def saveXMLToFile(Node document, String file) { 
    new File(file).withWriter { out -> 
     out << new StreamingMarkupBuilder().bind { mkp.xmlDeclaration() } 
     new XmlNodePrinter(new PrintWriter(out)).print(document) 
    } 
} 
+0

, 정말 고마워!! 나는 분명히 두 번째 것을 계속 지킬 것이다. – NickChase

관련 문제