यदि आप 5 मिनट से कम समय में जावा को एक्सएमएल और एक्सएमएल को जावा कोडिंग शुरू करना चाहते हैं, तो सरल एक्सएमएल सीरियलाइजेशन का प्रयास करें। JAXB API सीखने में घंटों खर्च न करें
http://simple.sourceforge.net/download/stream/doc/tutorial/tutorial.php
हालांकि, अगर आप वास्तव में JAXB सीखने के लिए उत्सुक हैं, तो यहां एक उत्कृष्ट ट्यूटोरियल है
http://blogs.oracle.com/teera/entry/jaxb_for_simple_java_xml
ट्यूटोरियल की सामग्री:
सरल जावा-एक्सएमएल क्रमांकन के लिए JAXB
जावा में XML क्रमांकन करने के कई तरीके हैं। यदि आप पार्सिंग और क्रमांकन पर ठीक-ठीक नियंत्रण चाहते हैं तो आप बेहतर प्रदर्शन के लिए SAX, DOM या Stax के लिए जा सकते हैं। फिर भी, जो मैं अक्सर करना चाहता हूं वह पीओजेओ और एक्सएमएल के बीच एक साधारण मानचित्रण है। हालाँकि, मैन्युअल रूप से XML इवेंट पार्सिंग करने के लिए जावा कक्षाएं बनाना तुच्छ नहीं है। मैंने हाल ही में JAXB को एक त्वरित और सुविधाजनक जावा-एक्सएमएल मैपिंग या धारावाहिककरण के रूप में पाया।
JAXB में बहुत सारी उपयोगी विशेषताएं हैं, आप यहां संदर्भ कार्यान्वयन की जांच कर सकते हैं। JAXB के बारे में अधिक जानने के लिए Kohsuke का ब्लॉग भी एक अच्छा संसाधन है। इस ब्लॉग प्रविष्टि के लिए, मैं आपको दिखाता हूँ कि JAXB के साथ एक सरल जावा-एक्सएमएल क्रमांकन कैसे करें।
XML के लिए POJO
मान लीजिए कि मेरे पास एक आइटम जावा ऑब्जेक्ट है। मैं किसी आइटम ऑब्जेक्ट को XML प्रारूप में क्रमबद्ध करना चाहता हूं। सबसे पहले मुझे जो करना है, वह इस POJO को javax.xml.bind.annotation। से कुछ XML एनोटेशन के साथ करना है। * पैकेज Item.java के लिए कोड सूची 1 देखें
कोड से
@XmlRootElement(name="Item")
इंगित करता है कि मैं मूल तत्व बनना चाहता हूं।
@XmlType(propOrder = {"name", "price"})
उस आदेश को इंगित करता है जो मैं चाहता हूं कि तत्व को एक्सएमएल आउटपुट में व्यवस्थित किया जाए।
@XmlAttribute(name="id", ...)
इंगित करता है कि आईडी मूल तत्व का एक गुण है।
@XmlElement(....)
इंगित करता है कि मैं आइटम के भीतर मूल्य और नाम चाहता हूं।
मेरा Item.java
तैयार है। फिर मैं आगे जा सकता हूं और marshaling आइटम के लिए JAXB स्क्रिप्ट बना सकता हूं।
//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>
आसान है ना? आप वैकल्पिक रूप से आउटपुट XML को टेक्स्ट स्ट्रिंग, स्ट्रीम, राइटर, कंटेंटहैंडलर आदि के रूप में चैनल कर सकते हैं, जैसे मार्शाल (...) विधि के पैरामीटर को बदल सकते हैं
...
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 करने के लिए POJO
चलो प्रक्रिया को उल्टा करते हैं। मान लें कि मेरे पास अब XML स्ट्रिंग डेटा का एक टुकड़ा है और मैं इसे Item.java ऑब्जेक्ट में बदलना चाहता हूं। XML डेटा (कोड लिस्टिंग 3) जैसा दिखता है
<?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>
फिर मैं इस xml कोड को आइटम ऑब्जेक्ट द्वारा अनमर्श कर सकता हूं
...
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;
...
पूर्ण कोड सूची के लिए कृपया कोड सूची 2 (main.java) देखें। XML स्रोत स्ट्रीम और फ़ाइल दोनों से कई रूपों में आ सकता है। एकमात्र अंतर, फिर से, विधि पैरामीटर है:
...
unmarshaller.unmarshal(new File("Item.xml")); // reading from file
...
// inputStream is an instance of java.io.InputStream, reading from stream
unmarshaller.unmarshal(inputStream);
XML स्कीमा के साथ मान्यता
आखिरी बात जो मैं यहां बताना चाहता हूं वह है जावा एक्सएमएल को अनमैर्सॉल करने से पहले स्कीमा के साथ इनपुट एक्सएमएल को मान्य करना। मैं एक 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 के लिए XML डेटा को अनमार्ट करने की कोशिश करता हूं, अगर इनपुट XML स्कीमा के अनुरूप नहीं है, तो अपवाद पकड़ा जाएगा। पूर्ण कोड लिस्टिंग के लिए कृपया कोड सूची 5 (अमान्य_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'.]
यहां मैंने पूर्णांक के बजाय स्ट्रिंग में 'आईडी' विशेषता को बदल दिया है।
यदि XML इनपुट स्कीमा के विरुद्ध वैध है, तो XML डेटा को सफलतापूर्वक Item.java ऑब्जेक्ट पर अनमर्श किया जाएगा।