Java XML Output - proper indenting for child items

16,287

Solution 1

If the Transformer implementation you're using is Xalan-J, then you should be able to use:

transformer.setOutputProperty(
   "{http://xml.apache.org/xslt}indent-amount", "5");

See also: http://xml.apache.org/xalan-j/usagepatterns.html

Solution 2

Document doc;

.....

TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
transformer.transform(new DOMSource(doc), new StreamResult(new File("filename.xml")));
transformer.transform(new DOMSource(doc), new StreamResult(System.out));
Share:
16,287
Dr1Ku
Author by

Dr1Ku

# An ambitious software developer, always keen on improving his craft // Inquisitive by default /* MSc. in Applied CS */

Updated on June 04, 2022

Comments

  • Dr1Ku
    Dr1Ku almost 2 years

    I'd like to serialize some simple data model into xml, I've been using the standard java.org.w3c -related code (see below), the indentation is better than no "OutputKeys.INDENT", yet there is one little thing that remains - proper indentation for child elements.

    I know that this has been asked before on stackoverflow , yet that configuration did not work for me, this is the code I'm using :

            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document doc = builder.newDocument();
    
            doc = addItemsToDocument(doc);
            // The addItemsToDocument method adds childElements to the document.
    
            TransformerFactory transformerFactory = TransformerFactory.newInstance();
            transformerFactory.setAttribute("indent-number", new Integer(4));
            // switching to setAttribute("indent-number", 4); doesn't help
    
            Transformer transformer = transformerFactory.newTransformer();
            transformer.setOutputProperty(OutputKeys.METHOD, "xml");
            transformer.setOutputProperty(OutputKeys.INDENT, "yes");
    
             DOMSource source = new DOMSource(doc);
           StreamResult result = new StreamResult(outFile);
            // outFile is a regular File outFile = new File("some/path/foo.xml");
    
            transformer.transform(source, result);
    

    The output produced is :

    <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <stuffcontainer>
    <stuff description="something" duration="240" title="abc">
    <otherstuff />
    </stuff>
    </stuffcontainer>
    

    Whereas I would want it (for more clarity) like :

    <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <stuffcontainer>
      <stuff description="something" duration="240" title="abc">
        <otherstuff />
      </stuff>
    </stuffcontainer>
    

    I was just wondering if there is a way of doing this, make it properly indented for the child elements.

    Thank you in advance !
    Happy Easter coding :-) !