簡體   English   中英

如何在使用JAXB進行編組時添加DOCTYPE和xml處理指令?

[英]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聲明。 只有在編組為OutputStreamWriterStreamResult時,此屬性才會生效。 請注意,此屬性與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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM