Groovy StreamingMarkupBuilder()生成非XML

Nic*_*ase 1 java xml grails 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
    }
}
Run Code Online (Sandbox Code Playgroud)

以下是我们如何实现目标:

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)
}
Run Code Online (Sandbox Code Playgroud)

但是,我没有得到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]]]
Run Code Online (Sandbox Code Playgroud)

我已经尝试过这些文档,但不幸的是我对Groovy的态度并不高,所以我确信我错过了一些简单的东西.:(

提前致谢...

epi*_*ian 7

看来,最简单的方法就是使用XmlUtil类,遗憾的是,这个类没有很好的记录:

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

(注意我改变了方法签名以接收节点)

我发现这个问题是groovy.xml.MarkupBuilder(或StreamingMarkupBuilder)和groovy.util.Node,其中MarkupBuilder的回报,似乎还没有相处得很好.至少我找不到将XML声明添加到Node的方法,然后可以用XmlNodePrinter打印; 或者在MarkupBuilder闭包中添加一个Node,我猜这应该是可能/容易的.如果有人知道如何做这些,请在评论中告诉它或添加新答案= D.

因此,第二个最简单的方法我能找到,而不XmlUtil的不良的记录魔术依托,在打印时首先使用StreamingMarkupBuilder(甚至没有MarkupBuilder的,XML声明,因为它似乎它需要一个根节点声明,这是我们不希望在这种情况)然后使用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)
    }
}
Run Code Online (Sandbox Code Playgroud)