"इतनी जल्दी नहीं, नौजवान! मेरे पास तुम्हारे लिए दो और सबक हैं!"

"दो? वाह। ठीक है, ठीक है। आप अपनी ठंडक बढ़ाने के लिए क्या नहीं करेंगे! मैं सब कान हूँ।"

"XML, JSON की तरह, अक्सर विभिन्न कार्यक्रमों और कंप्यूटरों के बीच डेटा पास करते समय उपयोग किया जाता है। और कई रूपरेखाएँ हैं जो XML के साथ काम करते समय जावा प्रोग्रामर के जीवन को बहुत सरल बनाती हैं। आज मैं आपको उनमें से एक से परिचित कराऊंगा।"

"जेएएक्सबी एक्सएमएल के साथ काम करने के लिए एक उत्कृष्ट बहुउद्देशीय ढांचा है।"

जेएक्सबी - 1

"जेएक्सबी जेडीके का हिस्सा है, इसलिए आपको इसे अलग से डाउनलोड करने की आवश्यकता नहीं है।"

"पहले मैं आपको एक उदाहरण दिखाता हूँ कि इसका उपयोग कैसे करना है, और फिर हम इसका विश्लेषण करेंगे। उदाहरण के लिए:"

किसी वस्तु को XML में बदलें
public static void main(String[] args) throws JAXBException
{
 // Create an object to be serialized into XML
 Cat cat = new Cat();
 cat.name = "Missy";
 cat.age = 5;
 cat.weight = 4;

 // Write the result of the serialization to a StringWriter
 StringWriter writer = new StringWriter();

 // Create a Marshaller object that will perform the serialization
 JAXBContext context = JAXBContext.newInstance(Cat.class);
 Marshaller marshaller = context.createMarshaller();
 marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
 // And here's the serialization itself:
 marshaller.marshal(cat, writer);

 // Convert everything written to the StringWriter
 String result = writer.toString();
 System.out.println(result);
}
एक वर्ग जिसका ऑब्जेक्ट एक्सएमएल में परिवर्तित हो जाता है
@XmlType(name = "cat")
@XmlRootElement
public class Cat
{
 public String name;
 public int age;
 public int weight;

 public Cat()
 {
 }
}
क्रमांकन परिणाम और स्क्रीन आउटपुट:
<बिल्ली> 
<नाम > मिस्सी </ 
नाम> <आयु> 5 </उम्र> 
<वजन> 4 < /वजन> 
</बिल्ली>

"किसी कारण से, लाइन दर लाइन, यह कोड मुझे JSON क्रमांकन की याद दिलाता है। समान एनोटेशन, लेकिन JSON ने एक ObjectMapper का उपयोग किया है, और यह संदर्भ और मार्शलर का उपयोग करता है।"

"हाँ। वे वास्तव में बहुत समान हैं। जैक्सन को JAXB के बाद बनाया गया था। लेकिन JAXB को भी कहीं से कॉपी किया गया था। आप खरोंच से कुछ प्रतिभा का आविष्कार नहीं कर सकते।"

"ऐसा लगता है।"

"ठीक है, यहाँ क्या हो रहा है:"

"4-7 पंक्तियों में, हम एक कैट ऑब्जेक्ट बनाते हैं और इसे डेटा से भरते हैं।"

"पंक्ति 10 में, हम परिणाम लिखने के लिए एक राइटर ऑब्जेक्ट बनाते हैं।"

"पंक्ति 13 में, हम 'संदर्भ' बनाते हैं। यह ऑब्जेक्टमैपर के समान है, लेकिन फिर इससे दो अतिरिक्त चाइल्ड ऑब्जेक्ट बनाए जाते हैं। मार्शलर क्रमांकन के लिए है, और अनमर्सहेलर डिसेरिएलाइज़ेशन के लिए है। जैक्सन से छोटे अंतर हैं, लेकिन यह है मौलिक रूप से अलग नहीं है।"

"पंक्ति 14 में, हम एक मार्शल ऑब्जेक्ट बनाते हैं। मार्शलिंग क्रमांकन का एक पर्याय है।"

"पंक्ति 15 में, हम FORMATTED_OUTPUT गुण को TRUE पर सेट करते हैं। यह परिणाम में पंक्ति विराम और रिक्त स्थान जोड़ देगा, ताकि कोड मानव-पठनीय हो, और केवल एक पंक्ति पर सभी पाठ न हो।"

"पंक्ति 17 में, हम वस्तु को क्रमबद्ध करते हैं।"

"20-21 पंक्तियों में, हम क्रमांकन के परिणाम को स्क्रीन पर प्रदर्शित करते हैं।"

"@XmlType(name = 'cat&') और @XmlRootElement एनोटेशन क्या हैं?"

" @XmlRootElement इंगित करता है कि यह वस्तु XML तत्वों की 'एक पेड़ की जड़' हो सकती है। दूसरे शब्दों में, यह उच्चतम स्तर का तत्व हो सकता है, और इसमें अन्य सभी तत्व शामिल हो सकते हैं।"

" @XmlType(name = 'cat') इंगित करता है कि वर्ग JAXB क्रमांकन में शामिल है, और इस वर्ग के लिए XML टैग का नाम भी निर्दिष्ट करता है।"

"ठीक है, अब मैं आपको XML अक्रमांकन का एक उदाहरण दिखाता हूँ:"

किसी वस्तु को XML से रूपांतरित करें
public static void main(String[] args) throws JAXBException
{
 String xmldata = "<cat><name>Missy</name><age>5</age><weight>4</weight></cat>";
 StringReader reader = new StringReader(xmldata);

 JAXBContext context = JAXBContext.newInstance(Cat.class);
 Unmarshaller unmarshaller = context.createUnmarshaller();

 Cat cat = (Cat) unmarshaller.unmarshal(reader);
}
एक वर्ग जिसका ऑब्जेक्ट एक्सएमएल से deserialized है
@XmlType(name = "cat")
@XmlRootElement
public class Cat
{
 public String name;
 public int age;
 public int weight;

 public Cat()
 {
 }
}

"सब कुछ लगभग वैसा ही है जैसा जैक्सन के साथ था। लेकिन अगर कोई बात हो, तो मैं यहाँ पर होने वाली हर बात को समझाऊँगा।"

"पंक्ति 3 में, हम एक स्ट्रिंग पास करते हैं जो एक्सएमएल को डिसेरिएलाइज़ करने के लिए स्टोर करता है।"

"पंक्ति 4 में, हम XML-स्ट्रिंग को StringReader में लपेटते हैं ।"

"पंक्ति 6 ​​में, हम एक JAXB संदर्भ बनाते हैं , जिसके लिए हम कक्षाओं की सूची पास करते हैं।"

"पंक्ति 7 में, हम एक Unmarshaller बनाते हैं - वह वस्तु जो डीरिएलाइज़ेशन करेगी।"

"पंक्ति 9 में, हम रीडर ऑब्जेक्ट से XML को डिसेर्बलाइज करते हैं और कैट ऑब्जेक्ट प्राप्त करते हैं।"

"अब यह सब लगभग स्पष्ट लग रहा है। लेकिन कुछ घंटे पहले, मैं यह पता लगाने के लिए अपने दिमाग पर जोर दे रहा था कि यह कैसे काम करता है।"

"ऐसा हमेशा होता है जब आप होशियार हो जाते हैं। जटिल चीजें सरल हो जाती हैं।"

"मैं होशियार हो रहा हूँ? मैं इससे खुश हुए बिना नहीं रह सकता।"

"बहुत बढ़िया। फिर यहां एनोटेशन की एक सूची दी गई है जिसका उपयोग आप JAXB क्रमांकन के परिणाम को नियंत्रित करने के लिए कर सकते हैं:"

जेएक्सबी एनोटेशन विवरण
@XmlElement (नाम) एक खेत के पास रखा।
फ़ील्ड को XML तत्व में संग्रहीत किया जाएगा।
आपको टैग का नाम सेट करने देता है।
@XmlAttribute (नाम) एक खेत के पास रखा।
फ़ील्ड को XML विशेषता के रूप में संग्रहीत किया जाएगा!
आपको विशेषता का नाम सेट करने देता है।
@XmlElementWrapper(nillable = true) एक खेत के पास रखा।
आपको तत्वों के समूह के लिए 'रैपर टैग' सेट करने देता है।
@ एक्सएमएल टाइप एक वर्ग के पास रखा गया।
यदि डिफ़ॉल्ट कन्स्ट्रक्टर निजी है तो ऑब्जेक्ट बनाने के लिए आपको एक विधि निर्दिष्ट करने देता है।
@XmlJavaTypeAdapter एक खेत के पास रखा।
आपको वह वर्ग निर्दिष्ट करने देता है जो फ़ील्ड को एक स्ट्रिंग में बदल देगा।

"कितना दिलचस्प है! लेकिन क्या आप मुझे एक उदाहरण प्रदान कर सकते हैं जो इन एनोटेशन का उपयोग करता है? एक स्पष्टीकरण एक बात है, लेकिन एक कामकाजी उदाहरण कुछ और है।"

"ठीक है। मैं आपको एक उदाहरण दिखाऊंगा। मैं सिर्फ यह जोड़ना चाहता था कि जेएक्सबी आपको फ़ील्ड के बजाय गेटर/सेटर विधियों को एनोटेट करने देता है।"

"यहाँ वह उदाहरण है जिसका मैंने वादा किया था:"

किसी वस्तु को XML में बदलें
public static void main(String[] args) throws JAXBException
{
 // Create Cat and Zoo objects to be serialized into XML
 Cat cat = new Cat();
 cat.name = "Missy";
 cat.age = 5;
 cat.weight = 4;

 Zoo zoo = new Zoo();
 zoo.animals.add(cat);
 zoo.animals.add(cat);

 // Write the result of the serialization to a StringWriter
 StringWriter writer = new StringWriter();

 // Create a Marshaller object that will perform the serialization
 JAXBContext context = JAXBContext.newInstance(Cat.class, Zoo.class);
 Marshaller marshaller = context.createMarshaller();
 marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
 // Here's the serialization itself
 marshaller.marshal(zoo, writer);

 // Convert everything written to the StringWriter into a String
 System.out.println(writer.toString());
}
एक वर्ग जिसका ऑब्जेक्ट एक्सएमएल में परिवर्तित हो जाता है
@XmlType(name = "zoo")
@XmlRootElement
public class Zoo
{
 @XmlElementWrapper(name = "wild-animals", nillable = true)
 @XmlElement(name = "tiger")
 public List<Cat> animals = new ArrayList<>();
}

public class Cat
{
 @XmlElement(name = "catname")
 public String name;
 @XmlAttribute(name = "age")
 public int age;
 @XmlAttribute(name = "w")
 public int weight;

 public Cat()
 {
 }
}
क्रमांकन परिणाम और स्क्रीन आउटपुट:
< 
चिड़ियाघर> <जंगली-जानवर 
> <बाघ की उम्र = "5" डब्ल्यू = "4"> 
<बिल्ली का नाम>मिसी</ 
बिल्ली 
का नाम> </ बाघ> <बाघ की उम्र = "5" डब्ल्यू = "4"> < 
बिल्ली का नाम> मिस्सी </catname> 
</tiger> < 
/जंगली-जानवरों 
> </चिड़ियाघर>

"ध्यान दें कि इस बार हम कैट ऑब्जेक्ट को क्रमबद्ध नहीं कर रहे हैं, लेकिन एक ज़ू ऑब्जेक्ट है जो कैट ऑब्जेक्ट्स के संग्रह को संग्रहीत करता है।"

"बिल्ली वस्तु को दो बार संग्रह में जोड़ा गया था, इसलिए यह दो बार एक्सएमएल में है।"

"संग्रह का अपना ' जंगली-जानवर ' टैग है जो संग्रह के सभी तत्वों को लपेटता है।"

" उम्र और वजन के तत्व उम्र और डब्ल्यू गुण बन गए हैं।"

"एक @XmlElement विशेषता का उपयोग करके, हमने कैट टैग को टाइगर टैग में बदल दिया है ।"

"पंक्ति 17 पर ध्यान दें। यहां हम दो वर्गों ( चिड़ियाघर और बिल्ली ) को JAXB संदर्भ में पास करते हैं, क्योंकि वे दोनों क्रमांकन में शामिल हैं।"

"आज का दिन बहुत दिलचस्प था। बहुत सी नई जानकारी।"

"हाँ। मैं तुम्हारे लिए खुश हूँ। अब, एक छोटा सा ब्रेक लो और हम जारी रखेंगे।"