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??
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.
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...
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With