Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JAXB Marshaller indentation

I'm using JAXB marshaller to create and format my .xml file. It works pretty well, except one place. The indentation lacks in two places:

                <Elem1>
                    <Elem2>
                        <Elem3 ID="Elem3.INFO">
<Elem4>INFO</Elem4>
                        </Elem3>
                        <Elem2>
                            <Elem3 ID="Elem3.TEMPLATE">
<Elem4>TEMPLATE</Elem4>
                            </Elem3>
                        </Elem2>
                        <Elem2>
                            <Elem3 ID="Elem3.LEVEL">
<Elem4>LEVEL</Elem4>
                            </Elem3>
                        </Elem2>
                    </Elem2>
                </Elem1>

The rest of the .xml file looks good. I'm using this method to prettify whole code:

marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);

Unfortunatelly it doesn't works for these two elements. Any ideas?

like image 778
z0nk0 Avatar asked Oct 12 '17 11:10

z0nk0


2 Answers

This annoying issue could be fixed by applying javax Transformer to the output.

import javax.xml.transform.*;
import javax.xml.transform.dom.*;
import javax.xml.transform.stream.StreamResult;

Object jaxbElement = // The object you want to marshall using jaxb.

JAXBContext context = JAXBContext.newInstance(jaxbElement.getClass());
Marshaller marshaller = context.createMarshaller();
OutputStream out = // Here your destination, FileOutStream, ByteOutStream etc
DOMResult domResult = new DOMResult();
marshaller.marshal(jaxbElement, domResult);

Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
transformer.transform(new DOMSource(domResult.getNode()), new StreamResult(out));
like image 152
Antonio Maria Sanchez Berrocal Avatar answered Nov 12 '22 00:11

Antonio Maria Sanchez Berrocal


This in an JAXB error, at most 8 levels of indentation are hardcoded:

IndentingUTF8XmlOutput.java:

    private void printIndent() throws IOException {
        write('\n');
        int i = depth%8;
        write( indent8.buf, 0, i*unitLen );
        i>>=3;  // really i /= 8;
        for( ; i>0; i-- )
            indent8.write(this);
    }

Source: https://community.oracle.com/thread/2351779

like image 7
z0nk0 Avatar answered Nov 12 '22 00:11

z0nk0