2012-05-06 10 views
1

StreamingMarkupBuilder()が非XMLを生成する理由を理解しようとしています。Groovy StreamingMarkupBuilder()非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]]] 

私が試しましたドキュメントは残念ですが、残念ながら私はGroovy上ではあまり上手くいませんので、私は単純なものが欠けていると確信しています。 :(事前に

おかげで...

答えて

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クロージャでNodeを追加することができます。もし誰かがこれらの方法を知っているなら、コメントで伝えるか、新しい答えを追加してください。D

XmlUtilの魔法のような魔法に頼らずに私が見つけた2番目に簡単な解決策は、 XML宣言最初の(それは我々がこのような場合にはしたくないルートノードの宣言を、必要と思えるようもないMarkupBuilderを、)StreamingMarkupBuilderを使用して、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

関連する問題