2009-06-20 15 views
17

मुझे जावा ऑब्जेक्ट पदानुक्रम से एक XML दस्तावेज़ बनाने की आवश्यकता है। जावा कक्षाओं और एक्सएमएल प्रारूप दोनों तय कर रहे हैं। तो मैं XStream जैसे एक्सएमएल सीरिएलाइज़र का उपयोग नहीं कर सकता: यह जावा कक्षाओं पर एक्सएमएल प्रारूप का आधार बनाता है। इसी तरह, जावा एक्सएमएल बाध्यकारी तकनीक जैसे JAXB काम नहीं करेगा, क्योंकि यह एक्सएमएल स्कीमा से जावा क्लासेस बनाता है [ed: लेकिन नीचे देखें]। मुझे एक मैनुअल दृष्टिकोण चाहिए।संक्षेप में जावा में एक एक्सएमएल दस्तावेज़ कैसे बनाया जाए?

निम्न तकनीक स्ट्रिंगबिल्डर मार्ग का परिणाम नाजुक और छोटी गाड़ी कोड (कम से कम मेरे लिए!) में होता है।

JAXP या JDOM जैसे एक एपीआई अधिक मजबूत कोड की ओर जाता है, लेकिन ये सुंदर वर्बोज़ हैं।

Groovy एक सुरुचिपूर्ण MarkupBuilder है:

def writer = new StringWriter() 
def xml = new MarkupBuilder(writer) 
xml.records() { 
    car(name:'HSV Maloo', make:'Holden', year:2006) { 
    country('Australia') 
    record(type:'speed', 'Production Pickup Truck with speed of 271kph') 
    } 
    car(name:'P50', make:'Peel', year:1962) { 
    country('Isle of Man') 
    record(type:'size', 'Smallest Street-Legal Car at 99cm wide and 59 kg') 
    } 
} 

अन्य भाषाओं (। जैसे Ruby), और भी बेहतर लोगों को है, हालांकि मैं शुद्ध जावा के साथ रहना चाहते हैं। जावा के लिए कुछ नए एक्सएमएल बिल्डर्स प्रतीत होते हैं, जैसे practicalxml और जेम्स मूर्ति का xmlbuilder

जावा में XML दस्तावेज़ बनाने के लिए और अधिक सुरुचिपूर्ण दृष्टिकोण क्या हैं?

सारांश:

जॉन डो dom4j और jdom का सुझाव दिया।

कर्टनडॉग ने जेएक्सबी का उपयोग करने की सिफारिश की है, और जेरिको ने मुझे चिपकाया है कि यह एक महत्वपूर्ण सुझाव था: फिर आप मेरे वर्तमान जावाबीन और जेएक्सबी जावाबीन के बीच मैप करने के लिए डोज़र का उपयोग कर सकते हैं।

थैगी JIBX की सिफारिश करता है और कर्टनडॉग और जेरिको के साथ सहमत है कि बाध्यकारी तकनीक वास्तव में व्यावहारिक हैं।

स्टैक्समैन StaxMate की सिफारिश करता है।

मैंने जो सामान देखा है, व्यावहारिक xml और जेम्स मूर्ति का xmlbuilder सबसे संक्षिप्त बिल्डर्स प्रतीत होता है, हालांकि यह नया है। जेएक्सबी जैसी बाध्यकारी तकनीकें अतिरिक्त सुरक्षा/स्वचालन प्रदान करती हैं। मुख्यधारा के विकल्पों में से, dom4j सभ्य लगता है, हालांकि अभी भी वर्बोज़ का प्रकार है।

public Document createDocument() { 
    Document document = DocumentHelper.createDocument(); 
    Element root = document.addElement("root"); 
    Element author2 = root.addElement("author") 
     .addAttribute("name", "Toby") 
     .addAttribute("location", "Germany") 
     .addText("Tobias Rademacher"); 
    Element author1 = root.addElement("author") 
     .addAttribute("name", "James") 
     .addAttribute("location", "UK") 
     .addText("James Strachan"); 
    return document; 
} 

संक्षिप्तता के लिए, आप इस एपीआई के ऊपर एक पतली मुखौटा लपेट संक्षिप्त प्रदान करने के लिए कर सकता है: यह एक "धाराप्रवाह इंटरफ़ेस" (mutators उत्परिवर्तित ऑब्जेक्ट के संदर्भ लौट ताकि वे एक साथ श्रृंखलित जा सकता है), जो मुझे पसंद है प्रदान करता है इन तरीकों में से कुछ के लिए समानार्थी शब्द (उदाहरण के लिए, addAttribute() के बजाय attr())।

धन्यवाद सब!

पीएस .: स्टीफन श्मिट ने जावा MarkupBuilder पर काम किया, हालांकि ऐसा लगता है कि इसे प्रकाशित नहीं किया गया है।

+0

कृपया http://dom4j.sourceforge.net/ पर dom4j लिंक ठीक करें :) –

+0

@PawelVeselov - धन्यवाद, यह दुखद है कि dom4j.org को कैसे मिलाया गया। –

+0

(ओ/टी) @ जिमफेरन्स मुझे नहीं लगता कि इसे कॉपेट किया गया है, वे अब dom4j सॉफ़्टवेयर का उल्लेख नहीं करते हैं। उनके और dom4j लाइब्रेरी पेज के बीच पेज स्टाइल उन लोगों के लिए समान है जो समान छत नहीं रखते हैं :) –

उत्तर

8

dom4j या jdom शायद सबसे सुरुचिपूर्ण हैं, आप कोड लिख सकते हैं कि आप इसे कैसा पसंद करते हैं। यदि मुझे याद है तो Dom4j में बिल्डर्स हैं, और हाँ कोड अधिक वर्बोज़ है।

Element.addElement("x").setAttribute("x", "y").xxxxx; 
+0

धन्यवाद, मैंने dom4j नहीं माना था। –

1

आप क्यों नहीं बस JAXB वैसे भी उपयोग नहीं करते हैं .. तो समस्या मानचित्रण आपत्ति उठाने का और आप एक्सएमएल पूरी तरह से बचने के एक बहुत ही सरल वस्तु बन जाता है।

+0

मुझे एक्सएमएल मैपिंग में ऑब्जेक्ट लिखना होगा जहां एक्सएमएल एक निश्चित मानक है (केबललैब्स 'एडीआई 1.1) और जावा क्लासेस भी पूर्व-निर्धारित हैं। –

+0

जावा वर्गों को स्कीमा में मैप करने के लिए जेएक्सबी का उपयोग करें और फिर जेएक्सबी कक्षाओं से पूर्व-निर्धारित जावा कक्षाओं में मैप करने के लिए डोज़र का उपयोग करें। – Jherico

+0

@ जेरिको: धन्यवाद, अभी तक डोज़र नहीं देखा है। तो आप वांछित स्कीमा ले सकते हैं और उनसे जावाबीन कक्षाओं का एक सेट सेट बनाने के लिए जेएक्सबी का उपयोग कर सकते हैं, फिर मौजूदा जावाबीन से जेएक्सबी जावाबीन में एक डोजर मैपिंग सेट अप कर सकते हैं। अधिक कोड की तरह लगता है लेकिन अधिक स्वचालन भी लगता है। मैं देखता हूं कि CurtainDog अब क्या मतलब है। –

0

आप JIBX पर विचार करने में सक्षम हो सकते हैं, तो आप अपने डोमेन मॉडल कक्षाओं से mapping को अपने लक्षित XML स्कीमा में परिभाषित करने में सक्षम हो सकते हैं।

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

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

1

जबकि स्क्रिप्टिंग भाषाओं में बिल्डरों के रूप में संक्षिप्त नहीं है, StaxMate चीजों को काफी सरल बनाता है; आमतौर पर पेड़ मॉडल के रूप में सरल रूप से सरल है, लेकिन यह अतिरिक्त रूप से टाइप किए गए अतिरिक्त (निहित रूपांतरण) का समर्थन करता है। और यह सब सीधे एक धारा में करता है, जिसका अर्थ है बहुत कम स्मृति उपयोग (और यदि मायने रखता है तो उच्च गति)।

इसके लायक होने के लिए, यह धाराप्रवाह शैली (2.0.x के रूप में) का भी समर्थन करता है, क्योंकि यह अक्सर समझ में आता है। पूर्ण डेटा बाध्यकारी (और पेड़ मॉडल) समाधान पर मुख्य लाभ शायद कम स्मृति उपयोग है; बहुत कम राज्य चारों ओर रखा जाता है, सभी आउटपुट जल्द से जल्द गंतव्य तक जाते हैं।

2

XOM पर एक नज़र डालें। यह तेज़, सरल, सही है, और वर्बोज़ नहीं है।

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