Java Groovy StreamingMarkupBuilder()生成非XML

Java Groovy StreamingMarkupBuilder()生成非XML,java,xml,grails,groovy,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(fi

我试图找出为什么在某些情况下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
    }
}
但是,我得到的不是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]]]

title[attributes={id={u2140\u5145\u361};value=[blah简介]]partintro
[attributes={id={u2140\u5145\u362};value=[para[attributes={id={u2140\u5145\u363};value=[My]
内容,诸如此类]]]
我尝试过这些文档,但不幸的是,我对Groovy没有太多的了解,所以我确信我错过了一些简单的东西(


提前感谢…

最简单的方法似乎是使用类,遗憾的是,没有很好的文档记录:

def saveXMLToFile(Node document, String file) {
    new File(file).withWriter { out ->
        XmlUtil.serialize(document, out)
    }
}
(注意,我更改了方法签名以接收节点)

我发现的问题是groovy.xml.MarkupBuilder(或StreamingMarkupBuilder)MarkupBuilder返回的groovy.util.Node似乎相处得不太好。至少我找不到一种方法将XML声明添加到一个节点,这样它就可以打印出来;或者在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)
    }
}
def saveXMLToFile(节点文档、字符串文件){
新文件(文件).withWriter{out->

out最简单的方法似乎是使用class,遗憾的是,它没有很好的文档记录:

def saveXMLToFile(Node document, String file) {
    new File(file).withWriter { out ->
        XmlUtil.serialize(document, out)
    }
}
(注意,我更改了方法签名以接收节点)

我发现的问题是groovy.xml.MarkupBuilder(或StreamingMarkupBuilder)MarkupBuilder返回的groovy.util.Node似乎相处得不太好。至少我找不到一种方法将XML声明添加到一个节点,这样它就可以打印出来;或者在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)
    }
}
def saveXMLToFile(节点文档、字符串文件){
新文件(文件).withWriter{out->

你的第一个解决方案效果很好,非常感谢!!我一定会把第二个也放在手边。你的第一个解决方案效果很好,非常感谢!!我一定会把第二个也放在手边。