2010-05-24 14 views
6

जावा 6 में, संपूर्ण xerces XML पार्सर/serializer कार्यान्वयन अब जावा रनटाइम (rt.jar) में है। संकुल com.sun। * नेमस्पेस के अंतर्गत ले जाया गया है, जो उन्हें क्लाइंट कोड के भीतर स्पष्ट संदर्भ के लिए ऑफ-सीमा रखता है। पार्सर का उपयोग करते समय यह कोई समस्या नहीं है, जिसे जैवएक्स एपीआई-परिभाषित कारखानों के माध्यम से तत्काल किया जाता है।जावा में xerces serialization 6

हालांकि, हमारा कोड xerces serialization (org.apache.xml.serialize। *) का भी उपयोग करता है। AFAICT, Serializer और OutputFormat के उदाहरण बनाने के लिए कोई javax.xml एपीआई-परिभाषित कारखानों नहीं हैं। ऐसा लगता है कि एक प्राप्त करने का एकमात्र तरीका com.sun.org.apache.xml.serialize को स्पष्ट रूप से कॉल करना है। * एपीआई।

मुझे javax.xml.stream में क्रमबद्धता कक्षाएं मिली हैं, लेकिन वे xerces आउटपुटफॉर्मैट क्लास जैसे आउटपुट-स्वरूपण नियंत्रण प्रदान नहीं कर रहे हैं।

प्रश्न:

वहाँ xerces.jar को शामिल किए बिना और यह भी स्पष्ट रूप से कॉम instantiating बिना, xerces क्रमबद्धता कार्यक्षमता एक javax मानक एपीआई के माध्यम से (जो rt.jar में है) तक पहुँचने के लिए एक रास्ता है। सूरज। * कक्षाएं?

यदि नहीं, तो क्या एक ही प्रभाव प्राप्त करने के लिए एक जैवएक्स एपीआई-अनुरूप तरीका है?

उत्तर

5

यदि आप एक ज़र्सेस सुविधा का उपयोग करना चाहते हैं जो किसी आधिकारिक java.* या javax.* एपीआई के माध्यम से खुलासा नहीं किया गया है, तो आपका एकमात्र असली समाधान है कि ज़ेर्स को तृतीय-पक्ष लाइब्रेरी के रूप में शामिल करना है। किसी भी तरह से जेरेस के जेआरई-आंतरिक संस्करण तक पहुंचना एक खतरनाक बात होगी, क्योंकि कुछ भी गारंटी नहीं देता है कि वैध जेआरई में भी उन वर्गों (वैकल्पिक जेआरई और एक ही जेआरई के अन्य संस्करण भी एक अलग कार्यान्वयन या यहां तक ​​कि जेएक्सपी एपीआई लागू कर सकते हैं बस इसे दूसरे पैकेज में ले जाएं)।

+0

यह वह जगह है जहां हमने शुरू किया, और यह निष्कर्ष है कि हम भी साथ आए हैं। यदि आप ज़ेरिस के गैर-जावा-एपीआई भागों (विशेष रूप से क्रमबद्धता) का उपयोग करना चाहते हैं तो Xerces सहित कोई रास्ता नहीं है। हमने सिस्टम गुणों में जेरिस कक्षाओं के किसी भी स्पष्ट उल्लेख को हटाने के लिए हमारे कोडबेस को संशोधित किया है, जिससे इसे पार्सर्स और ट्रांसफार्मर को तत्काल करने पर डिफ़ॉल्ट का उपयोग करने दिया जाता है। यह क्लासलोडिंग विवादों को रोकना चाहिए क्योंकि सभी डिफ़ॉल्ट com.sun में हैं। * –

1

जहां तक ​​मुझे पता है कि ऐसा करने के लिए कोई आधिकारिक API नहीं है। जावा एक्सएमएल एपीआई अजीब तरह से एक्सएमएल पार्सिंग के लिए हैं।

हालांकि, आप फ़ाइल में DOM Document लिखने के लिए XML रूपांतरण API का उपयोग कर सकते हैं। this example देखें।

+0

मैं अब रूपांतरण API की जांच कर रहा हूं। ऐसा लगता है कि आउटपुटफॉर्मैट के माध्यम से उपलब्ध स्वरूपण निर्दिष्ट करने में लचीलापन प्रतीत नहीं होता है, जब तक कि यह कवर के तहत xerces serialization का उपयोग नहीं कर रहा है और serializer को पैरामीटर प्राप्त करने का एक तरीका है। –

0

javax.xml.bind.JAXBContext? यदि आप एक्सएमएल को ऑब्जेक्ट्स को बाध्य/क्रमबद्ध करने की कोशिश कर रहे हैं, तो जेएक्सबी के साथ जाने का मानक है। यदि आप कच्चे पार्सिंग कर रहे हैं, org.xml.sax और/या org.w3c.dom आपके पास जो दिख रहे हैं, उसके पास होना चाहिए।

अद्यतन: com.javax.transform संकुल को मदद करनी चाहिए। ट्रांसफॉर्मर उदाहरण here पर एक नज़र डालें।

+0

नहीं, मैं जावा ऑब्जेक्ट्स को XML पर बाध्य नहीं कर रहा हूं। यह सिर्फ डीओएम को क्रमबद्ध करने के बारे में है, और कुछ भी नहीं है लेकिन xerces/xalan serialization API आउटपुट स्वरूपण (इंडेंटेशन, व्हाइटस्पेस, आदि) पर कोई नियंत्रण प्रदान करता है। –

1

यदि आप सूर्य एपीआई का संदर्भ नहीं देना चाहते हैं, तो आप अनुमोदित निर्देशिका में जेरिस डाल सकते हैं। यह सूर्य प्रतिलिपि/कार्यान्वयन को प्रतिस्थापित करेगा, लेकिन फिर आप चिंता के बिना एपीआई का उपयोग कर सकते हैं (यह करने के लिए यह "आधिकारिक" तरीका है)।

जावा अंतर्निहित कार्यान्वयन आउटपुट पर अच्छा नियंत्रण प्रदान नहीं करता है, हालांकि Xerces और API गुणों का उपयोग करके आउटपुट पर कुछ बेहतर नियंत्रण प्राप्त करना संभव है, क्योंकि एपीआई अतिरिक्त गुणों को पार करने का समर्थन करता है जो अन्य कार्यान्वयन मिल सकते हैं उपयोगी। आखिरी बार खुद की कोशिश नहीं की है (मैं केवल दस्तावेज द्वारा जा रहा हूँ)।

संपादित करें (टिप्पणी के जवाब में): यदि आप एक ईर्ष्या में ज़र्सेस का उपयोग करना चाहते हैं, जहां आप उस अंतर्निहित जेडीके को उस बिंदु पर नियंत्रित नहीं करते हैं जहां आप JAXP के लिए अपना खुद का प्रतिस्थापन API निर्दिष्ट कर सकते हैं, तो आपको Xerces का संदर्भ देना होगा सीधे (या सूर्य पैकेज पुनर्लेखन का संदर्भ लें)।

यदि आप अनुमोदित निर्देशिका में ज़ेरिस डाल सकते हैं (या अन्यथा अनुमोदित सेटिंग को ओवरराइड कर सकते हैं - जो कि ऐप सर्वर में स्पष्ट रूप से असंभव प्रतीत होता है, हालांकि मुझे विशेष रूप से वेबलॉगिक नहीं पता) गुणों को सेट करने का "जेडीके" तरीका अंतर्निहित कार्यान्वयन TransformerFactory.setAttribute के माध्यम से है, जो कार्यान्वयन के आधार पर Transformer.setParameter पर बातचीत कर सकता है।

मुझे यह जोड़ना चाहिए कि सूर्य के बंडलों के अंतर्निहित संस्करण को पर्याप्त होना चाहिए, और यदि वेबलॉगिक इसका उपयोग करता है (या यदि यह पर्याप्त है तो अपने स्वयं के जेरिस का उपयोग करता है) तो आप यहां भाग्यशाली हो सकते हैं, और केवल गुणों को पारित करने में सक्षम हो सकते हैं और यह काम है।

+0

हम अनुमोदित निर्देशिका का उपयोग करेंगे, लेकिन हम अपने उत्पाद को एक WAR/EAR में एक वेबस्पेयर वातावरण में तैनात करने की कोशिश कर रहे हैं जिसमें बहुत सख्त सुरक्षा आवश्यकताएं हैं। एपीआई में आप अंतर्निहित xerces कार्यान्वयन के लिए अतिरिक्त गुणों को पारित करने की संभावना देखते हैं? –

+0

@ जिम, मैंने कुछ लिंक प्रदान करने के लिए अपना जवाब संपादित किया। – Yishai