如何在使用JAXB进行编组时添加DOCTYPE和xml处理指令?

时间:2010-05-27 07:42:13

标签: java xml jaxb marshalling

我正在将JAXB bean编组(序列化)为输出流。如何添加DOCTYPE声明和xml处理指令以进行输出?

我目前正在做这样的编组:

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);

我希望输出看起来像这样:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Something SYSTEM "some.dtd">
<?xml-stylesheet type="text/xsl" href="some.xsl"?>

JAXB bean是生成的代码,因此我不想更改它们。

有一些黑客和未记录的技巧(请参阅Making JAXB generate an XML processing instruction)添加xml processing instructionsdoctype。但是这样做的首选或正确方法是什么?

1 个答案:

答案 0 :(得分:20)

JAXB RI拥有专有的Marshaller属性com.sun.xml.bind.xmlHeaders(请参阅XML Preamble Control

  

此属性允许您指定   XML前导码(<?xml ...>   声明)和任何其他PI,   评论,DOCTYPE声明   跟着它。此属性生效   只有当你在编组时   OutputStreamWriter或   StreamResult。请注意这一点   财产与财产互动   Marshaller.JAXB_FRAGMENT财产。   如果该属性未被触及或设置   为了假,那么JAXB总会写   它的XML前导码,所以这个属性可以   仅用于编写PI,评论,   DOCTYPE等。另一方面,如果   它设置为true,然后JAXB不会   写自己的XML前导码,所以这个   属性可能包含自定义XML   前导码。

这应该做你需要的。如果您正在使用Java5和JAXB RI,那么这应该可行。如果您使用Java6及其包含的JAXB实现,则com.sun.xml.bind.xmlHeaders名称可能会有所不同,因此请尝试使用com.sun.xml.internal.bind.xmlHeaders