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的态度并不高,所以我确信我错过了一些简单的东西.:(
提前致谢...
看来,最简单的方法就是使用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)