[英]How to add DOCTYPE and xml processing instructions when marshalling with JAXB?
我正在將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是生成的代碼,所以我不想更改它們。
有一些hacks和未記錄的技巧(請參閱使JAXB生成XML處理指令 )來添加xml處理指令和doctype 。 但是這樣做的首選或正確方法是什么?
JAXB RI具有專有的Marshaller
屬性com.sun.xml.bind.xmlHeaders
(請參閱XML Preamble Control :
此屬性允許您指定XML前導碼(
<?xml ...>
聲明)以及其后的任何其他PI,注釋,DOCTYPE
聲明。 只有在編組為OutputStream
,Writer
或StreamResult
時,此屬性才會生效。 請注意,此屬性與Marshaller.JAXB_FRAGMENT
屬性進行交互。 如果該屬性未被觸及或設置為false,則JAXB將始終編寫其XML前導碼,因此此屬性僅可用於編寫PI,注釋,DOCTYPE
等。另一方面,如果將其設置為true,則JAXB不會編寫自己的XML前導碼,因此該屬性可能包含自定義XML前導碼。
這應該做你需要的。 如果您正在使用Java5和JAXB RI,那么這應該可行。 如果您使用Java6及其包含的JAXB實現,則com.sun.xml.bind.xmlHeaders
名稱可能不同,因此請嘗試使用com.sun.xml.internal.bind.xmlHeaders
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.