java – XMLStreamWriter:インデント

javax.xml.stream.XMLStreamWriter(Java SE 6)を使ってフォーマットされたXMLを直接書く方法は本当にありませんか。 JAXBなどの他のXML APIや一部のDOMライブラリでこれが可能なので、これは本当に信じられないことです。 .NET XMLStreamWriterと同等のものでさえ、このAFAIKを使用できます(クラスがSystem.Xml.XmlTextWriterであることを正しく覚えていれば)。

これは私が持っている唯一のオプションはフォーマットされた出力を生成するためにXMLを再解析することであることを意味します。

例えば。:

            StringWriter sw = new StringWriter();
    XMLOutputFactory xmlOutputFactory = XMLOutputFactory.newFactory();
    XMLStreamWriter xmlStreamWriter = xmlOutputFactory.createXMLStreamWriter(sw);
    writeXml(xmlStreamWriter);
    xmlStreamWriter.flush();
    xmlStreamWriter.close();

    TransformerFactory factory = TransformerFactory.newInstance();

    Transformer transformer = factory.newTransformer();
    transformer.setOutputProperty(OutputKeys.INDENT, "yes");
    transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");

    StringWriter formattedStringWriter = new StringWriter();
    transformer.transform(new StreamSource(new StringReader(sw.toString())), new StreamResult(formattedStringWriter));
    System.out.println(formattedStringWriter);

この解決策の問題は、プロパティ “{http://xml.apache.org/xslt}indent-amount”です。私はそれに関するドキュメントを見つけられませんでした、そしてそれは移植性があると保証されるようには思えません。

標準のJava 6クラスでこれを実行したいのであれば、他にどのような選択肢がありますか?きれいに印刷するためだけにJAXBまたはDOMオブジェクトグラフを作成します。

あなたのwriteXmlメソッドであなたのドキュメントをフォーマットするために必要なコードを追加することができます。 (入れ子のレベルを示すために)単純に深さカウンタを管理します。それからwriteStartElementの前とwriteEndElementの後にインデントを挿入するために深さインデックスを使います。

for(int x=0; x<depth; x++) {
    xmlStreamWriter.writeCharacters("    ");
}
元のURL:https://stackoverflow.com/questions/4616383/xmlstreamwriter-indentation

元のテキストを転載:java – XMLStreamWriter:インデント