StAX XML форматирование в Java - PullRequest
21 голосов
/ 14 ноября 2008

Возможно ли использовать StAX (в частности, woodstox) для форматирования выходного XML-файла с помощью новых строк и вкладок, т.е. в форме:

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

вместо:

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

Если это невозможно в Вудстоксе, есть ли другие легковесные либы, которые могут это сделать?

Ответы [ 10 ]

24 голосов
/ 02 сентября 2010

Есть com.sun.xml.txw2.output.IndentingXMLStreamWriter

XMLOutputFactory xmlof = XMLOutputFactory.newInstance();
XMLStreamWriter writer = new IndentingXMLStreamWriter(xmlof.createXMLStreamWriter(out));
9 голосов
/ 14 ноября 2008

Через JDK: transformer.setOutputProperty(OutputKeys.INDENT, "yes");.

6 голосов
/ 03 марта 2010

Если вы используете API курсора StAX, вы можете сделать отступ для вывода, поместив XMLStreamWriter в прокси с отступом . Я попробовал это в моем собственном проекте, и он работал хорошо.

4 голосов
/ 14 июля 2016

Использование 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();
}
4 голосов
/ 14 февраля 2013

Вместо того чтобы полагаться на класс com.sun ..., который может исчезнуть (или переименовать в класс com.oracle ...), я рекомендую загрузить служебные классы StAX с java.net. Этот пакет содержит класс IndentingXMLStreamWriter, который прекрасно работает. (Источник и Javadoc включены в загрузку.)

4 голосов
/ 27 января 2009

Как насчет 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

1 голос
/ 25 ноября 2008

Не уверен насчет stax, но недавно здесь обсуждалась красивая печать xml

красивая печать XML из Java

это была моя попытка найти решение

Как красиво печатать XML с Java?

с использованием org.dom4j.io.OutputFormat.createPrettyPrint () метод

1 голос
/ 14 ноября 2008

Если вы используете метод итерации (XMLEventReader), не можете ли вы просто присоединить символ новой строки '\ n' к соответствующим XMLEvents при записи в ваш файл XML?

0 голосов
/ 01 июля 2018

если вы используете 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 голосов
/ 18 сентября 2013

Для 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>
...