25

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

<元素1>
  <元素2>
   一些数据
  </元素2>
</元素1>

代替:

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

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

4

10 回答 10

25

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

XMLOutputFactory xmlof = XMLOutputFactory.newInstance();
XMLStreamWriter writer = new IndentingXMLStreamWriter(xmlof.createXMLStreamWriter(out));
于 2010-09-02T08:29:01.693 回答
7

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

于 2008-11-14T15:50:05.960 回答
7

使用 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();
}
于 2016-07-14T10:34:25.540 回答
6

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

于 2010-03-03T04:09:17.857 回答
4

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

于 2009-01-27T20:40:01.910 回答
4

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

于 2013-02-14T15:32:23.703 回答
1

如果您使用的是迭代方法 (XMLEventReader),在写入您的 XML 文件时,您不能在相关的 XMLEvents 中附加一个新行 '\n' 字符吗?

于 2008-11-14T15:49:12.933 回答
1

不确定stax,但最近有一个关于漂亮打印xml的讨论here

来自java的漂亮打印xml

这是我尝试的解决方案

如何从 Java 漂亮地打印 XML?

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

于 2008-11-24T23:51:14.767 回答
1

如果您使用的是 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);
于 2018-07-01T12:16:49.077 回答
0

使用 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>
于 2013-09-18T15:20:09.793 回答