2010-05-27 40 views
12

我正在編組(串行化)JAXB bean以輸出流。我如何添加DOCTYPE聲明和xml處理指令來輸出?如何在使用JAXB進行封送時添加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。但是,這樣做的首選或正確的方法是什麼?

回答

17

的JAXB RI有一個專有Marshaller財產com.sun.xml.bind.xmlHeaders(見XML Preamble Control

此屬性允許您指定 XML序言(<?xml ...> 聲明)以及任何額外的督察, 評論,DOCTYPE聲明 此屬性僅當您編組爲 OutputStreamWriterStreamResult時生效 。請注意,這 屬性與 Marshaller.JAXB_FRAGMENT屬性進行交互。 如果該屬性是不變或設置 爲false,那麼JAXB總是寫 它的XML序言,所以這個屬性可以 只能用來編寫督察,評論, DOCTYPE,等等。另一方面,如果 是設置爲true,那麼JAXB不會 寫自己的XML序言,所以這 屬性可能包含自定義XML 序言。

這應該做你所需要的。如果你使用Java5和JAXB RI,那麼這應該是正常的。如果您將Java6與其包含的JAXB實現一起使用,則名稱可能會不同,因此請嘗試com.sun.xml.internal.bind.xmlHeaders

+3

你的意思是另一種方式嗎?如果您使用的是JAXB RI,那麼com.sun.xml.internal.bind.xmlHeaders會起作用,如果使用jaxb impl,那麼它的com.sun.xml.bind.xmlHeaders是正確的? – kalyan 2011-12-19 13:18:49

相關問題