web-dev-qa-db-ja.com

Java)のStAXXMLフォーマット

StAX(具体的にはwoodstox)を使用して、出力xmlを改行とタブでフォーマットすることは可能ですか?

 <element1> 
 <element2> 
 someData 
 </ element2> 
 </ element1> 

の代わりに:

<element1> <element2> someData </ element2> </ element1>

これがwoodstoxで不可能な場合、これを実行できる他の軽量ライブラリはありますか?

23
Lehane

JDK経由:transformer.setOutputProperty(OutputKeys.INDENT, "yes");

9
Josh

Com.Sun.xml.txw2.output.IndentingXMLStreamWriterがあります

XMLOutputFactory xmlof = XMLOutputFactory.newInstance();
XMLStreamWriter writer = new IndentingXMLStreamWriter(xmlof.createXMLStreamWriter(out));
24
Juha Syrjälä

JDKの使用 Transformer

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();
}
6
Roland

StAXカーソルAPIを使用している場合は、XMLStreamWriterを インデントプロキシ でラップすることで出力をインデントできます。私は自分のプロジェクトでこれを試しましたが、うまくいきました。

6
Andrew Swan

どうですか 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

4
StaxMan

なくなる(またはcom.Oracle ... classに名前が変更される)可能性のあるcom.Sun ...クラスに依存するのではなく、Java.netから StAXユーティリティクラス をダウンロードすることをお勧めします。このパッケージには、うまく機能するIndentingXMLStreamWriterクラスが含まれています。 (ソースとjavadocはダウンロードに含まれています。)

4
Thad

Staxについてはよくわかりませんが、ここでxmlのプリティプリントについて最近議論がありました

Javaからのxmlをプリティプリント

これは私の解決策の試みでした

JavaからXMLをプリティプリントする方法は?

org.dom4j.io.OutputFormat.createPrettyPrint()メソッドを使用する

1
mlo55

反復メソッド(XMLEventReader)を使用している場合、XMLファイルに書き込むときに、関連するXMLEventsに改行 '\ n'文字を付加するだけではいけませんか?

1
Spencer Kormos

xMLEventWriterを使用している場合、それを行う簡単な方法は次のとおりです。

XMLOutputFactory outputFactory = XMLOutputFactory.newInstance();
        XMLEventWriter writer = outputFactory.createXMLEventWriter(w);
        XMLEventFactory eventFactory = XMLEventFactory.newInstance();
        Characters newLine = eventFactory.createCharacters("\n"); 
        writer.add(startRoot);
        writer.add(newLine);
0
Nh Wh

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>
0