Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

XMLStreamWriter: indentation

Tags:

java

xml

is there really no way to directly write formatted XML using javax.xml.stream.XMLStreamWriter (Java SE 6)??? This is really unbelievable, as other XML APIs such as JAXB and some DOM libraries are able to do this. Even the .NET XMLStreamWriter equivalent is able to this AFAIK (if I remember correctly the class is System.Xml.XmlTextWriter).

This means the only option I have is to reparse the XML to generate formatted output??

E.g.:

            StringWriter sw = new StringWriter();     XMLOutputFactory xmlOutputFactory = XMLOutputFactory.newFactory();     XMLStreamWriter xmlStreamWriter = xmlOutputFactory.createXMLStreamWriter(sw);     writeXml(xmlStreamWriter);     xmlStreamWriter.flush();     xmlStreamWriter.close();      TransformerFactory factory = TransformerFactory.newInstance();      Transformer transformer = factory.newTransformer();     transformer.setOutputProperty(OutputKeys.INDENT, "yes");     transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");      StringWriter formattedStringWriter = new StringWriter();     transformer.transform(new StreamSource(new StringReader(sw.toString())), new StreamResult(formattedStringWriter));     System.out.println(formattedStringWriter); 

The problem with this solution is the property "{http://xml.apache.org/xslt}indent-amount". I didn't find any documentation about it and it doesn't seem to be guaranteed to be portable.

So what other options do I have, if I want to do this with standard Java 6 classes? Create a JAXB or DOM object graph just for pretty printing??

like image 741
Puce Avatar asked Jan 06 '11 15:01

Puce


People also ask

What is XMLStreamWriter?

The XMLStreamWriter interface in the StAX cursor API lets applications write back to an XML stream or create entirely new streams. XMLStreamWriter has methods that let you: Write well-formed XML. Flush or close the output. Write qualified names.


1 Answers

This exact question has been answered some months ago and one of the answers is to use the IndentingXMLStreamWriter class:

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

It is a neat solution as far as the code goes, but careful: this is a com.sun.* class, there is no guarantee of its general availability...

like image 52
Tomislav Nakic-Alfirevic Avatar answered Oct 05 '22 16:10

Tomislav Nakic-Alfirevic