Java中的StAX XML格式

是否可以使用StAX(特别是woodstox)使用换行符和制表符格式化输出xml,即以下列forms:

 
   
   一些数据
   
 

代替:

    someData   

如果在woodstox中无法做到这一点,是否还有其他轻量级库可以做到这一点?

通过JDK: transformer.setOutputProperty(OutputKeys.INDENT, "yes");

有com.sun.xml.txw2.output.IndentingXMLStreamWriter

 XMLOutputFactory xmlof = XMLOutputFactory.newInstance(); XMLStreamWriter writer = new IndentingXMLStreamWriter(xmlof.createXMLStreamWriter(out)); 

如果您正在使用StAX游标API,则可以通过将XMLStreamWriter包装在缩进代理中来缩进输出。 我在自己的项目中试过这个并且效果很好。

我建议从java.net下载StAX实用程序类 ,而不是依赖于可能消失的com.sun …类(或者重命名为com.oracle …类)。 这个包包含一个可以很好地工作的IndentingXMLStreamWriter类。 (源代码和javadoc包含在下载中。)

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

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 extends StaxEventItemWriter { @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输出的代码:

  net.java.dev.stax-utils stax-utils 20070216  

如果您使用的是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);