2010-05-27 15 views
12

मैं उत्पादन धारा के लिए जेएक्सबी बीन्स marshalling (serializing) हूँ। मैं ouput के लिए DOCTYPE घोषणा और एक्सएमएल प्रसंस्करण निर्देश कैसे जोड़ सकता हूं?JAXB के साथ marshalling जब 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 सेम कोड उत्पन्न कर रहे हैं तो मैं नहीं करना चाहते उन्हें बदलो।

xml processing instructions और doctype जोड़ने के लिए कुछ हैक्स और अनियंत्रित चालें (Making JAXB generate an XML processing instruction देखें) हैं। लेकिन ऐसा करने का पसंदीदा या सही तरीका क्या है?

उत्तर

17

JAXB आरआई एक मालिकाना Marshaller संपत्ति com.sun.xml.bind.xmlHeaders है (XML Preamble Control देखें:

यह गुण आप एक एक्सएमएल प्रस्तावना (<?xml ...> घोषणा) और किसी भी अतिरिक्त PIS, टिप्पणी, DOCTYPE घोषणा कि निर्दिष्ट करने के लिए अनुमति देता है इसका पालन करता है। यह संपत्ति पर प्रभावी होती है जब आप OutputStream, Writer, या StreamResult पर marshalling कर रहे हैं। ध्यान दें कि यह संपत्ति Marshaller.JAXB_FRAGMENT संपत्ति के साथ इंटरैक्ट करती है। हैं कि संपत्ति अछूता या गलत सेट किया गया है, तो JAXB हमेशा अपने एक्सएमएल प्रस्तावना लिखते थे, इसलिए इस संपत्ति केवल PIS, टिप्पणियाँ, DOCTYPE, आदि लिखने के लिए दूसरी ओर इस्तेमाल किया जा सकता है, अगर यह है सत्य पर सेट करें, फिर JAXB अपना स्वयं का एक्सएमएल प्रीम्बल नहीं लिख पाएगा, इसलिए प्रॉपर्टी में कस्टम एक्सएमएल प्रीम्बल हो सकता है।

यह आपको जो चाहिए वह करना चाहिए। यदि आप जावा 5 और जेएक्सबी आरआई का उपयोग कर रहे हैं, तो यह सिर्फ काम करना चाहिए। यदि आप जावा 6 का उपयोग अपने जेएक्सबी कार्यान्वयन के साथ कर रहे हैं, तो com.sun.xml.bind.xmlHeaders नाम अलग हो सकता है, इसलिए इसके बजाय com.sun.xml.internal.bind.xmlHeaders आज़माएं।

+3

क्या आपका मतलब सही तरीका था? यदि आप जेएक्सबी आरआई का उपयोग कर रहे हैं तो com.sun.xml.internal.bind.xml हेडर काम करेंगे, अगर जैक्सबी इंप्यू का उपयोग किया जाता है तो यह com.sun.xml.bind.xml हैडर सही है? – kalyan

संबंधित मुद्दे