2009-03-26 15 views
110

मेरे पास एक विशाल क्विकबुक एसडीके है। एक्सएसडी स्कीमा फ़ाइल जो एक्सएमएल अनुरोध/प्रतिक्रियाओं को परिभाषित करती है जिन्हें मैं क्विकबुक से भेज/प्राप्त कर सकता हूं।.XSD फ़ाइलों से जावा कक्षाएं उत्पन्न करें ...?

मैं इन .XSD फ़ाइलों से आसानी से जावा कक्षाएं उत्पन्न करने में सक्षम होना चाहता हूं, जिसे मैं जावा ऑब्जेक्ट्स में मार्शल एक्सएमएल और जावा ऑब्जेक्ट्स को एक्सएमएल में उपयोग कर सकता हूं।

क्या ऐसा करने का कोई आसान तरीका है ...?

आदर्श रूप से, इसे रन-टाइम पर मूल जावा डिस्ट्रो से बाहर किसी भी पुस्तकालय की आवश्यकता नहीं होगी। लेकिन मैं लचीला हूं ...

+5

यदि आप मैन्युअल पीढ़ी चाहते हैं, तो अपनी ग्रहण परियोजना में .xsd फ़ाइल रखें, फ़ाइल पर राइट क्लिक करें, फिर "उत्पन्न करें" –

उत्तर

113

JAXB जो भी आप चाहते हैं वह करता है। यह जेआरई/जेडीके में 1.6

+5

दुर्भाग्यवश, यह कार्यक्षमता अब जावा 9 के रूप में उपलब्ध नहीं होगी ऐसा इसलिए है क्योंकि कक्षाएं शामिल हैं (विशेष रूप से, com.sun.tools.xjc। * कक्षाएं) अब जेडीके के माध्यम से उपलब्ध नहीं रहेंगी। – Marco

+1

मुझे नहीं लगता कि जेडीके से इसे हटाने का मुद्दा होना चाहिए, क्योंकि java.net प्रोजेक्ट (उत्तर में लिंक) शायद रहने जा रहा है। – stmoebius

14

XMLBeans ऐसा करेगा। विशेष रूप से "scomp" कमांड।

संपादित करें: XMLBeans retired रहा है, अधिक जानकारी के लिए this stackoverflow post देखें।

+2

हाँ, लेकिन XMLBeans बंद कर दिया गया है। – stmoebius

+0

http://stackoverflow.com/questions/27727546/what-to-use-instead-of-xmlbeans-now-that-it-has-been-retired – TofuBeer

7

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

+0

यदि आप कास्टर के साथ कोड उत्पन्न करते हैं, तो क्या वे उत्पन्न कक्षाएं अभी भी इस तथ्य के बाद कोस्टर पर निर्भर हैं? या क्या मैं उन वर्गों को कैस्टर पुस्तकालयों के बिना मशीन पर ले जा सकता हूं, और वे अभी भी काम करेंगे? –

+0

नहीं, जेनरेट कक्षाएं कैस्टर पुस्तकालयों पर निर्भर नहीं हैं। – dave

+0

क्या ऐसा करने के लिए कास्टर का उपयोग करने के तरीके पर कोई अच्छा ट्यूटोरियल है? यह बहुत ही आशाजनक दिखता है ... लेकिन जावा कम से कम कहने के लिए, मेरी सबसे मजबूत भाषा नहीं है। मुझे यकीन नहीं है कि मुझे कैस्टर फ़ाइलों/पैकेजों को डाउनलोड करने की ज़रूरत है और वास्तव में कोड जनरेशन कैसे करें ... किसी भी चरण-दर-चरण नौसिखिया उदाहरणों के आसपास? –

2

प्रसिद्ध JAXB

एक maven plugin है कि किसी भी निर्माण चरण आप चाहते हैं पर आप के लिए ऐसा कर सकता है नहीं है।

आप दोनों तरीकों से इस चीज कर सकता है: XSD < -> जावा

35

आप कम से कम 5 मिनट में XML और जावा के लिए एक्सएमएल के लिए जावा कोडिंग शुरू करने के लिए चाहते हैं, सरल एक्सएमएल क्रमबद्धता का प्रयास करें। JAXB एपीआई सीखने घंटे खर्च मत करो http://simple.sourceforge.net/download/stream/doc/tutorial/tutorial.php

हालांकि, अगर आप JAXB सीखने पर वास्तव में चाहते हैं, यहाँ एक उत्कृष्ट ट्यूटोरियल है ट्यूटोरियल के http://blogs.oracle.com/teera/entry/jaxb_for_simple_java_xml

सामग्री:

सरल के लिए JAXB जावा-एक्सएमएल क्रमबद्धता

जावा में एक्सएमएल क्रमबद्ध करने के कई तरीके हैं। यदि आप पार्सिंग और क्रमबद्धता पर बढ़िया नियंत्रण चाहते हैं तो आप बेहतर प्रदर्शन के लिए SAX, DOM, या Stax के लिए जा सकते हैं। फिर भी, जो मैं अक्सर करना चाहता हूं वह पीओजेओ और एक्सएमएल के बीच एक सरल मैपिंग है। हालांकि, एक्सएमएल इवेंट पार्सिंग मैन्युअल रूप से करने के लिए जावा क्लासेस बनाना मुश्किल नहीं है। मैंने हाल ही में जेएक्सबी को एक त्वरित और सुविधाजनक जावा-एक्सएमएल मैपिंग या सीरियलाइजेशन पाया है।

जेएक्सबी में बहुत सारी उपयोगी विशेषताएं हैं, आप यहां संदर्भ कार्यान्वयन की जांच कर सकते हैं। Kohsuke's Blog जेएक्सबी के बारे में अधिक जानने के लिए भी एक अच्छा संसाधन है। इस ब्लॉग एंट्री के लिए, मैं आपको दिखाऊंगा कि जेएक्सबी के साथ एक सरल जावा-एक्सएमएल सीरियलाइजेशन कैसे करें। एक्सएमएल को

POJO

मान लीजिए मैं एक आइटम जावा वस्तु है। मैं एक आइटम ऑब्जेक्ट को एक्सएमएल प्रारूप में क्रमबद्ध करना चाहता हूं। मुझे पहले क्या करना है इस पीओजेओ को javax.xml.bind.annotation से कुछ एक्सएमएल एनोटेशन के साथ एनोटेट करना है। * पैकेज। आइटम के लिए कोड प्रविष्टि 1 देखें।जावा

कोड

  • @XmlRootElement(name="Item") से पता चलता है कि मैं मूल तत्व होना चाहता हूँ।
  • @XmlType(propOrder = {"name", "price"}) ऑर्डर को इंगित करता है कि मैं XML आउटपुट में तत्व को व्यवस्थित करना चाहता हूं।
  • @XmlAttribute(name="id", ...) इंगित करता है कि आईडी रूट तत्व के लिए एक विशेषता है।
  • @XmlElement(....) इंगित करता है कि मुझे मूल्य और नाम आइटम के भीतर तत्व होना चाहिए।

मेरा Item.java तैयार है। मैं आगे बढ़ सकता हूं और मार्शलिंग आइटम के लिए जेएक्सबी स्क्रिप्ट बना सकता हूं।

//creating Item data object 
Item item = new Item(); 
item.setId(2); 
item.setName("Foo"); 
item.setPrice(200); 
..... 

JAXBContext context = JAXBContext.newInstance(item.getClass()); 
Marshaller marshaller = context.createMarshaller(); 
//I want to save the output file to item.xml 
marshaller.marshal(item, new FileWriter("item.xml")); 

पूर्ण कोड लिस्टिंग के लिए कृपया कोड लिस्टिंग 2 main.java देखें। आउटपुट कोड लिस्टिंग 3 item.xml फ़ाइल बनाई गई है। ऐसा लगता है:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<ns1:item ns1:id="2" xmlns:ns1="http://blogs.sun.com/teera/ns/item"> 

<ns1:itemName>Foo</ns1:itemName> 
<ns1:price>200</ns1:price> 

</ns1:item> 

आसान है? आप वैकल्पिक रूप से पाठ स्ट्रिंग, स्ट्रीम, लेखक, ContentHandler, आदि के रूप में उत्पादन एक्सएमएल बस द्वारा चैनल कर सकते हैं POJO को

आइए तरह

... 
JAXBContext context = JAXBContext.newInstance(item.getClass()); 
Marshaller marshaller = context.createMarshaller(); 
// save xml output to the OutputStream instance 
marshaller.marshal(item, <java.io.OutputStream instance>); 

... 
JAXBContext context = JAXBContext.newInstance(item.getClass()); 
Marshaller marshaller = context.createMarshaller(); 
StringWriter sw = new StringWriter(); 
//save to StringWriter, you can then call sw.toString() to get java.lang.String 
marshaller.marshal(item, sw); 

एक्सएमएल विधि मार्शल (...) के मानदंड को बदलना प्रक्रिया को उलट दें। मान लें कि अब मेरे पास XML स्ट्रिंग डेटा का एक टुकड़ा है और मैं इसे Item.java ऑब्जेक्ट में बदलना चाहता हूं। XML डेटा (कोड लिस्टिंग 3) मैं तो unmarshal इस एक्सएमएल द्वारा

... 
ByteArrayInputStream xmlContentBytes = new ByteArrayInputStream (xmlContent.getBytes()); 
JAXBContext context = JAXBContext.newInstance(Item.getClass()); 
Unmarshaller unmarshaller = context.createUnmarshaller(); 
//note: setting schema to null will turn validator off 
unmarshaller.setSchema(null); 
Object xmlObject = Item.getClass().cast(unmarshaller.unmarshal(xmlContentBytes)); 
return xmlObject; 
... 

मद वस्तु के लिए कोड पूरा कोड के लिए लिस्टिंग कर सकते हैं

तरह
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<ns1:item ns1:id="2" xmlns:ns1="http://blogs.sun.com/teera/ns/item"> 
<ns1:itemName>Bar</ns1:itemName> 
<ns1:price>80</ns1:price> 
</ns1:item> 

कृपया कोड लिस्टिंग 2 (main.java) देख लग रहा है। एक्सएमएल स्रोत स्ट्रीम और फाइल दोनों से कई रूपों में आ सकता है। फर्क सिर्फ इतना है, फिर से, विधि पैरामीटर है:

... 
unmarshaller.unmarshal(new File("Item.xml")); // reading from file 
... 
// inputStream is an instance of java.io.InputStream, reading from stream 
unmarshaller.unmarshal(inputStream); 

XML स्कीमा के साथ मान्यता

अंतिम बात मैं यहाँ उल्लेख करना चाहते हैं जावा वस्तु के लिए unmarshalling से पहले स्कीमा के साथ इनपुट XML मान्य है। मैं item.xsd नामक एक एक्सएमएल स्कीमा फ़ाइल बनाता हूं। पूर्ण कोड लिस्टिंग के लिए कृपया कोड लिस्टिंग 4 (Item.xsd) देखें। अब मुझे क्या करना है सत्यापन के लिए इस स्कीमा को पंजीकृत करना है।

... 
Schema schema = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI) 
.newSchema(new File("Item.xsd")); 
unmarshaller.setSchema(schema); //register item.xsd shcema for validation 
... 

मैं POJO को unmarshal XML डेटा करने का प्रयास करते हैं, अगर इनपुट XML स्कीमा पुष्टि नहीं है, अपवाद पकड़ा दिया जाएगा। पूर्ण कोड लिस्टिंग के लिए कृपया कोड लिस्टिंग 5 (invalid_item.xml) देखें।

javax.xml.bind.UnmarshalException 
- with linked exception: 
javax.xml.bind.JAXBException caught: null 
[org.xml.sax.SAXParseException: cvc-datatype-valid.1.2.1: 'item1' is 
           not a valid value for 'integer'.] 

यहां मैं पूर्णांक की बजाय स्ट्रिंग में 'आईडी' विशेषता बदलता हूं।

यदि एक्सएमएल इनपुट स्कीमा के खिलाफ मान्य है, तो एक्सएमएल डेटा आइटम.जावा ऑब्जेक्ट को सफलतापूर्वक अनारक्षित कर दिया जाएगा।

+1

यह * बहुत * आशाजनक, और जेएक्सबी की तरह कुछ बड़े और जटिल की तुलना में मुझे इसकी आवश्यकता के लिए काम करने के लिए बहुत आसान और अच्छा लगता है। दुर्भाग्यवश, मुझे अपने मौजूदा .XSD से .class फ़ाइलों को कनवर्ट करने का कोई तरीका नहीं दिख रहा है, जो वास्तव में मुझे शुरू करने की आवश्यकता है। क्या इसे करने का कोई तरीका है? –

+6

दुर्भाग्य से जेएक्सबी ट्यूटोरियल वाला ब्लॉग ऑफ़लाइन है। –

+0

हम इसे आसानी से jaxb2-maven-plugin का उपयोग करके कर सकते हैं, इस ट्यूटोरियल को जांचें http://www.journaldev.com/1312/how-to-generate-java-classes-from-xsd-using-xjc-maven-plugin – Pankaj

4

क्या जैक्सबी का एक्सजेसी इसका संभावित उत्तर नहीं है?मैं वही चीज़ हासिल करने की कोशिश कर रहा हूं। फिर भी "कोशिश" चरण में। एक्सजेसी में आया, इसलिए साझा करने का विचार।

5

जेएक्सबी सीमा।

मैंने अपनी राय के अनुसार जेएक्सबी पर काम किया, यह एक्सएमएल और जावा ऑब्जेक्ट्स के बीच डेटा से निपटने का एक अच्छा तरीका है। सकारात्मक पक्ष रनटाइम के दौरान डेटा पर प्रदर्शन और नियंत्रण में सिद्ध और बेहतर होते हैं। निर्मित उपकरण या स्क्रिप्ट के अच्छे उपयोग के साथ यह बहुत सारे कोडिंग प्रयासों को दूर ले जाएगा।

मुझे पता चला कि कॉन्फ़िगरेशन हिस्सा सीधे काम नहीं है, और विकास पर्यावरण सेटअप प्राप्त करने में घंटों बिताए हैं।

हालांकि मैंने सामना करने वाली मूर्खतापूर्ण सीमा के कारण इस समाधान को छोड़ दिया। मेरा एक्सएमएल स्कीमा डेफिनिशन (एक्सएसडी) में "वैल्यू" नाम के साथ एक विशेषता/तत्व है और मुझे एक्सएसडी का उपयोग करना है। इस बहुत कम बाधा ने मेरे बाध्यकारी कदम को मजबूर कर दिया XJC पहले से उपयोग की गई त्रुटि "संपत्ति 'मान के साथ विफल रहा।"

यह जेएक्सबी कार्यान्वयन के कारण है, बाध्यकारी प्रक्रिया प्रत्येक वर्ग में कुछ विशेषताओं को जोड़कर एक्सएसडी से जावा ऑब्जेक्ट्स बनाने की कोशिश करती है और उनमें से एक मूल्य विशेषता है। जब मैंने अपने एक्सएसडी को संसाधित किया तो शिकायत की कि उस नाम के साथ पहले से ही एक संपत्ति है।

0

JAXB सीमा, जब अलग-अलग विशेषताओं के लिए एक ही नाम XSD करने के लिए इनलाइन JAXB अनुकूलन जोड़ रहा है होने के लिए एक समाधान के बारे में बात:

+

। । बाइंडिंग घोषणाएं । ।

या बाहरी अनुकूलन ...

आप पर आगे की जानकारियां देख सकते हैं: http://jaxb.java.net/tutorial/section_5_3-Overriding-Names.html

105

ऊपर "का उपयोग JAXB" टिप्पणी पर विस्तार करने के लिए,

विंडोज में "%java_home%\bin\xjc" -p [your namespace] [xsd_file].xsd

उदाहरण के लिए, "%java_home%\bin\xjc" -p com.mycompany.quickbooks.obj quickbooks.xsd

थोड़ा रुको, और अगर आप एक अच्छी तरह से गठित XSD फ़ाइल था, तो आप कुछ अच्छी तरह से गठित जावा वर्गों

6

खैर सबसे अच्छा विकल्प %java_home%\bin\xjc -p [your namespace] [xsd_file].xsd है मिल जाएगा।

मेरे पास एक प्रश्न भी है यदि हमारे पास रिवर्स इंजीनियरिंग करने का विकल्प है। यदि हां हम pojo वर्ग से xsd उत्पन्न कर सकते हैं?

+0

xjc केवल जावा 6 – sree

26

ग्रहण आईडीई का उपयोग करना: -

  1. प्रति नया/मौजूदा परियोजना में XSD।
  2. सुनिश्चित करें कि आपके पास क्लासपाथ में JAXB आवश्यक JAR है। आप एक here डाउनलोड कर सकते हैं।
  3. एक्सएसडी फ़ाइल पर राइट क्लिक करें -> जेनरेट करें -> जेएक्सबी कक्षाएं।
12

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

<plugin> 
    <groupId>org.codehaus.mojo</groupId> 
    <artifactId>jaxb2-maven-plugin</artifactId> 

    <executions> 
     <execution> 
     <goals> 
     <goal>xjc</goal> 
     </goals> 
     </execution> 
    </executions> 
    <configuration> 
     <schemaDirectory>src/main/webapp/schemas/</schemaDirectory> 
    </configuration> 
    </plugin> 

    </plugins> 
    </pluginManagement> 
</build> 
</project> 

बस "के अंतर्गत src/मुख्य/webapp/स्कीमा अपने XSD फ़ाइलें रख:

बस वांछित जगह पर लक्ष्य से उन्हें कॉपी, यहाँ pom.xml कि मैं XSD फाइलों से वर्गीकृत बनाने के लिए इस्तेमाल किया है/"और मेवेन उन्हें संकलित समय पर पाएंगे।

आशा यह आप में मदद मिलेगी, अधिक जानकारी http://www.beingjavaguys.com/2013/04/create-spring-web-services-using-maven.html

में पाया जा सकता आशा है कि यह मदद मिलेगी :)

+0

में उपलब्ध है क्या यह वास्तव में संसाधन निर्देशिका के साथ काम करता है? (src/main/resource/schemas), क्योंकि मैं इसे प्राप्त करता रहता हूं: 'कोई एक्सएसडी फाइल नहीं मिली। कृपया अपनी प्लगइन कॉन्फ़िगरेशन जांचें। ' – zygimantus

11

सबसे आसान तरीका कमांड लाइन का उपयोग कर रहा है। बस अपने .XSD फ़ाइल निर्देशिका में टाइप करें:

xjc myFile.xsd. 

तो, जावा सभी POJOs उत्पन्न होगा।

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