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);