I am marshalling (serializing) JAXB beans to output stream. How can I add DOCTYPE declaration and xml processing instructions to ouput?
I am doing currently marshalling like this:
JAXBContext jaxbContext = JAXBContext.newInstance("com.example.package");
Marshaller marshaller = jaxbContext.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
SchemaFactory schemaFactory = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");
Schema schema = schemaFactory.newSchema(schemaSource);
marshaller.setSchema(schema);
marshaller.marshal(object, output);
I’d like have output that looks something like this:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Something SYSTEM "some.dtd">
<?xml-stylesheet type="text/xsl" href="some.xsl"?>
JAXB bean are generated code so I don’t want to change them.
There are some hacks and undocumented tricks (see Making JAXB generate an XML processing instruction) to add the xml processing instructions and doctype. But what is the preferred or right way to do this?
The JAXB RI has a proprietary
Marshallerpropertycom.sun.xml.bind.xmlHeaders(see XML Preamble Control:This should do what you need. If you’re using Java5 and the JAXB RI, then this should just work. If you’re using Java6 with its included JAXB implementation, the
com.sun.xml.bind.xmlHeadersname might be different, so trycom.sun.xml.internal.bind.xmlHeadersinstead.