簡體   English   中英

Java中的StAX XML格式

[英]StAX XML formatting in Java

是否可以使用StAX(特別是woodstox)使用換行符和制表符格式化輸出xml,即以下列形式:

<element1>
  <element2>
   someData
  </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: transformer.setOutputProperty(OutputKeys.INDENT, "yes");

如果您正在使用StAX游標API,則可以通過將XMLStreamWriter包裝在縮進代理中來縮進輸出。 我在自己的項目中試過這個並且效果很好。

使用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();
}

我建議從java.net下載StAX實用程序類 ,而不是依賴於可能會消失的com.sun ...類(或者重命名為com.oracle ...類)。 這個包包含一個可以很好地工作的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

如果您正在使用迭代方法(XMLEventReader),那么在寫入XML文件時,是否只能將新行'\\ n'字符附加到相關的XMLEvents?

不確定stax,但最近有一個關於漂亮打印xml的討論

來自java的漂亮的打印xml

這是我嘗試解決的問題

如何從Java中打印XML?

使用org.dom4j.io.OutputFormat.createPrettyPrint()方法

使用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>

如果您正在使用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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM