1

我试图弄清楚为什么在某些情况下 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 的了解并不多,所以我确信我错过了一些简单的东西。:(

提前致谢...

4

1 回答 1

7

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

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

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

我发现的问题是 groovy.xml.MarkupBuilder(或 StreamingMarkupBuilder)和MarkupBuilder 返回的 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)
    }
}
于 2012-05-06T06:09:30.617 回答