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 宣言を Node に追加する方法が見つからなかったので、それをXmlNodePrinterで出力できました。またはMarkupBuilderクロージャーにノードを追加します。これは可能/簡単だと思います。誰かがこれらのいずれかを行う方法を知っている場合は、コメントでそれを伝えるか、新しい回答を追加してください = D

したがって、文書化が不十分な XmlUtil の魔法に頼ることなく、私が見つけることができる 2 番目に簡単な解決策は、最初に 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 に答える