StAX(特にwoodstox)を使用して、出力xmlを改行とタブでフォーマットすることは可能ですか?つまり、次の形式で:
<要素1> <要素2> 一部のデータ </element2> </element1>
それ以外の:
<element1><element2>someData</element2></element1>
これがwoodstoxで不可能な場合、これを行うことができる他の軽量ライブラリはありますか?
StAX(特にwoodstox)を使用して、出力xmlを改行とタブでフォーマットすることは可能ですか?つまり、次の形式で:
<要素1> <要素2> 一部のデータ </element2> </element1>
それ以外の:
<element1><element2>someData</element2></element1>
これがwoodstoxで不可能な場合、これを行うことができる他の軽量ライブラリはありますか?
com.sun.xml.txw2.output.IndentingXMLStreamWriter があります
XMLOutputFactory xmlof = XMLOutputFactory.newInstance();
XMLStreamWriter writer = new IndentingXMLStreamWriter(xmlof.createXMLStreamWriter(out));
JDKトランスフォーマーの使用:
public String transform(String xml) throws XMLStreamException, TransformerException
{
Transformer t = TransformerFactory.newInstance().newTransformer();
t.setOutputProperty(OutputKeys.INDENT, "yes");
t.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
Writer out = new StringWriter();
t.transform(new StreamSource(new StringReader(xml)), new StreamResult(out));
return out.toString();
}
JDK 経由: transformer.setOutputProperty(OutputKeys.INDENT, "yes");
.
StAX カーソル API を使用している場合は、インデント プロキシで XMLStreamWriter をラップすることにより、出力をインデントできます。私は自分のプロジェクトでこれを試しましたが、うまくいきました。
なくなる(またはcom.oracle ... classに名前が変更される)可能性のあるcom.sun ... classに依存するのではなく、java.netからStAXユーティリティクラスをダウンロードすることをお勧めします。このパッケージには、うまく機能するIndentingXMLStreamWriterクラスが含まれています。(ソースとjavadocはダウンロードに含まれています。)
StaxMateはどうですか:
http://www.cowtowncoder.com/blog/archives/2006/09/entry_21.html
Woodstox、高速、低メモリ使用量 (メモリ内ツリーが構築されていない)、および次のようなインデントでうまく機能します。
SMOutputFactory sf = new SMOutputFactory(XMLOutputFactory.newInstance());
SMOutputDocument doc = sf.createOutputDocument(new FileOutputStream("output.xml"));
doc.setIndentation("\n ", 1, 2); // for unix linefeed, 2 spaces per level
// write doc like:
SMOutputElement root = doc.addElement("element1");
root.addElement("element2").addCharacters("someData");
doc.closeRoot(); // important, flushes, closes output
Staxについてはわかりませんが、ここでxmlをきれいに印刷することについて最近議論がありました
これは私の解決策でした
org.dom4j.io.OutputFormat.createPrettyPrint()メソッドを使用する
反復メソッド (XMLEventReader) を使用している場合、XML ファイルに書き込むときに、関連する XMLEvents に改行文字 '\n' を付けることはできませんか?
Spring Batch では、このJIRA BATCH-1867以降、サブクラスが必要です。
public class IndentingStaxEventItemWriter<T> extends StaxEventItemWriter<T> {
@Setter
@Getter
private boolean indenting = true;
@Override
protected XMLEventWriter createXmlEventWriter( XMLOutputFactory outputFactory, Writer writer) throws XMLStreamException {
if ( isIndenting() ) {
return new IndentingXMLEventWriter( super.createXmlEventWriter( outputFactory, writer ) );
}
else {
return super.createXmlEventWriter( outputFactory, writer );
}
}
}
ただし、Spring Batch には StAX 出力をインデントするコードが含まれていないため、これには追加の依存関係が必要です。
<dependency>
<groupId>net.java.dev.stax-utils</groupId>
<artifactId>stax-utils</artifactId>
<version>20070216</version>
</dependency>