Java: IndentingXMLStreamWriter alternative?

If other suggestions don't work, you can get an indenting XMLStreamWriter from Saxon like this:

Processor p = new net.sf.saxon.s9api.Processor();
Serializer s = p.newSerializer();
s.setOutputProperty(Property.METHOD, "xml");
s.setOutputProperty(Property.INDENT, "yes");
s.setOutputStream(....);
XMLStreamWriter writer = s.getXMLStreamWriter();

One advantage is that this allows you a lot of control over the serialization using other serialization properties.


Instead of com.sun.xml.internal.txw2.output.IndentingXMLStreamWriter use com.sun.xml.txw2.output.IndentingXMLStreamWriter that can be found in:

<dependency>
    <groupId>org.glassfish.jaxb</groupId>
    <artifactId>txw2</artifactId>
    <version>2.2.11</version>
</dependency>

Just expanding on Michael Kay's answer ( https://stackoverflow.com/a/10108591/2722227 ).

maven dependencies:

<dependency>
            <groupId>net.sf.saxon</groupId>
            <artifactId>Saxon-HE</artifactId>
            <version>9.6.0-5</version>
</dependency>

java code:

import java.io.OutputStream;
import net.sf.saxon.Configuration;
import net.sf.saxon.s9api.Processor;
import net.sf.saxon.s9api.SaxonApiException;
import net.sf.saxon.s9api.Serializer;
import net.sf.saxon.s9api.Serializer.Property;

public class Main {

    public static void main(String[] args) throws Exception {
        OutputStream outputStream = System.out;
        writeXmlDocument(outputStream);
    }

    private static void writeXmlDocument(OutputStream outputStream){
        Configuration config = new Configuration();
        Processor processor = new Processor(config);
        Serializer serializer = processor.newSerializer();
        serializer.setOutputProperty(Property.METHOD, "xml");
        serializer.setOutputProperty(Property.INDENT, "yes");
        serializer.setOutputStream(outputStream);

        try {
            XMLStreamWriter writer = serializer.getXMLStreamWriter();
            try {
                writer.writeStartDocument();
                {
                    writer.writeStartElement("root_element_name");
                    {
                        writer.writeStartElement("child_element");
                        writer.writeEndElement();
                    }
                    writer.writeEndElement();
                }
                writer.writeEndDocument();
                writer.flush();
                writer.close();
            } catch (XMLStreamException e) {
                e.printStackTrace();
            }

        } catch (SaxonApiException e) {
            e.printStackTrace();
        }
    }

}

There is an alternative implementation of IndentingXmlStreamWriter, which is provided as part of the open source stax-utils project here: http://java.net/projects/stax-utils/pages/Home

stax-utils seems to be a project set up to provide utilities based around the jsr-173 streaming xml api for Java

You'd need to add the stax-utils jar as a dependency for your project. Then you can import javanet.staxutils.IndentingXmlStreamWriter

Since stax-utils is in the maven central repository, if you use maven for your dependencies you can get it with:

    <dependency>
        <groupId>net.java.dev.stax-utils</groupId>  
        <artifactId>stax-utils</artifactId>
        <version>20070216</version>
        <exclusions>
            <exclusion>
                <groupId>com.bea.xml</groupId>
                <artifactId>jsr173-ri</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

Functionality seems very similar / equivalent to the txw2 class

I have excluded jsr173-ri since I am using jdk 1.7. I think 1.6+ has the jsr173 api as a standard feature, but if you are using 1.5 or lower you'd need the extra jsr173 jar.