我正在将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 instructions和doctype。但是这样做的首选或正确方法是什么?
答案 0 :(得分:20)
JAXB RI拥有专有的Marshaller
属性com.sun.xml.bind.xmlHeaders
(请参阅XML Preamble Control:
此属性允许您指定 XML前导码(
<?xml ...>
声明)和任何其他PI, 评论,DOCTYPE
声明 跟着它。此属性生效 只有当你在编组时OutputStream
,Writer
或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
。