जावा में XML क्रमांकन? [बन्द है]


104

.NET के एक्सएमएल क्रमांकन का जावा एनालॉग क्या है?


6
आह, शानदार पुराने समय जब एक जैसे लाइनर सवाल एसओ पर स्वागत करते थे। इसलिए उपयोगी है। इन सभी के बिना "आपने क्या प्रयास किया है?" / "विवरण प्रदान करें" बकवास लोग आज पढ़ना पसंद करते हैं।
गोटो 0

जवाबों:


81

2008 उत्तर "आधिकारिक" जावा एपीआई इसके लिए अब XML बाइंडिंग के लिए JAXB - जावा एपीआई है। ओरेकल द्वारा ट्यूटोरियल देखें । संदर्भ कार्यान्वयन http://jaxb.java.net/ पर रहता है

2018 अपडेट नोट करें कि जावा ईई और कोरा मॉड्यूल को जेडीके 9 में एसई में अपदस्थ किया गया है और जेडीके 11 में एसई से हटा दिया जाना है । इसलिए, JAXB का उपयोग करने के लिए या तो यह आपके मौजूदा एंटरप्राइज़ वर्ग के वातावरण में होना चाहिए, जो आपके उदाहरण के लिए ऐप सर्वर द्वारा बंडल किया गया है, या आपको इसे मैन्युअल रूप से लाने की आवश्यकता होगी।


2
यह सही है, JAXB निश्चित रूप से सबसे अच्छा विकल्प है!
ivan_ivanovich_ivanoff

1
JAXB को जावा 10 के रूप में मानक जावा वितरण से हटा दिया गया था, जो अब एक पुस्तकालय बनाता है जिसे आप अपने आवेदन के साथ बंडल करना चाहते हैं यदि आप इसे चाहते हैं, जब तक कि आप एक संदर्भ में काम नहीं कर रहे हैं जो पहले से ही आपके लिए इसे बंडल करता है।
थियोडोर मर्डॉक

69

XStream बहुत विन्यास और पैसे के बिना XML के लिए ऑब्जेक्ट को क्रमबद्ध करने में बहुत अच्छा है! (यह बीएसडी लाइसेंस के तहत है)।

हमने सादे पुराने जावा-क्रमांकन को बदलने के लिए अपनी परियोजना में इसका इस्तेमाल किया और इसने लगभग बॉक्स से बाहर काम किया।


3
बहुत उपयोगी है, यह गैर-स्ट्रिंग नोड ऑब्जेक्ट्स के साथ JGraph जैसे जटिल वृक्ष संरचनाओं पर समस्या हो सकती है।
mikek3332002

सरल और बेहतर तो अन्य समाधान
daitangio

मुझे XStream पसंद है। केवल एक चीज यह है कि मुझे समझ में नहीं आता कि वास्तविक XML से पहले एक चरित्र क्यों जोड़ा जाता है।
जेम्स पी।

17

"सिंपल एक्सएमएल सीरियलाइजेशन" प्रोजेक्ट

आप साधारण XML सरलीकरण परियोजना को देखना चाहते हैं । यह सबसे पास की चीज़ है जो मैंने System.Xml.Serialization में .Net पर पाया है।


हालांकि इसे प्रत्येक क्षेत्र के लिए मानचित्रण एनोटेशन की आवश्यकता होती है।
एम.पी.

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

1
मैं दिल से "सरल" के रूप में अच्छी तरह से समर्थन करता हूं । मैंने इसे कुछ परियोजनाओं पर बड़ी सफलता के साथ उपयोग किया है। "सरल" वास्तव में बहुत आसान है कि JAXB। सबसे उपयुक्त जब आपके पास अपेक्षाकृत सरल आवश्यकताएं होती हैं: उन वस्तुओं को प्राप्त करें जिन्हें बाद में फिर से हाइड्रेटेड करने के लिए भंडारण के लिए लिखा जाना चाहिए। JAXB में और अधिक सुविधाएँ और लचीलापन है, लेकिन यह एक "80/20" प्रकार की चीज़ है, अधिकांश समय अधिकांश परियोजनाओं में आपको केवल सुविधाओं के सरल सबसेट की आवश्यकता हो सकती है।
बेसिल बोर्के

अच्छी तरह से काम करता है अगर आप सिर्फ 1: 1 मैपिंग चाहते हैं। यदि आपकी कक्षाएं विकसित होती हैं और आपको अभी भी पुराने एक्सएमएल को डिसेर्बलाइज करने की आवश्यकता है, तो आप मुद्दों में भाग लेते हैं क्योंकि प्रलेखन और त्रुटि संदेश दोनों कुछ अस्पष्ट हैं। समस्या का निदान आमतौर पर करने योग्य है, लेकिन यह पता लगाना कि इसे कैसे ठीक किया जा सकता है कई दिन लग सकते हैं।
टूलबार

13

JAXB JDK मानक संस्करण संस्करण 1.6+ का हिस्सा है। तो यह FREEडाउनलोड करने और प्रबंधन करने के लिए कोई अतिरिक्त पुस्तकालय नहीं है। एक सरल उदाहरण यहां पाया जा सकता है

XStream लगता है मर गया। अंतिम अद्यतन 6 दिसंबर 2008 को हुआ था। SimpleJAXB के रूप में आसान और सरल लगता है लेकिन मुझे उद्यम उपयोग के लिए इसका मूल्यांकन करने के लिए कोई लाइसेंसिंग जानकारी नहीं मिली।


4
XStream मृत नहीं है, यह सिर्फ परिपक्व और स्थिर है - जिसका अर्थ कोर कार्यक्षमता में जोड़ने के लिए बहुत कुछ नहीं है। समान ही JAXB संदर्भ कार्यान्वयन के लिए सही है, पिछले कुछ वर्षों के लिए बहुत अधिक गतिविधि नहीं है।
२०:१४ पर स्टैक्मैन मैन

9

वर्थ उल्लेख करते हुए कि संस्करण 1.4 के बाद से, जावा में java.beans.XMLEncoder और java.beans.XMLDecoder की कक्षाएं थीं। ये कक्षाएं XML एन्कोडिंग का प्रदर्शन करती हैं जो कम से कम XML Serialization के लिए तुलनीय है और कुछ परिस्थितियों में आपके लिए ट्रिक कर सकती है।

यदि आपका वर्ग अपने गेटर्स और सेटर के लिए जावाबिन स्पेसिफिकेशन से चिपक जाता है, तो यह विधि उपयोग करने के लिए सीधी है और आपको स्कीमा की आवश्यकता नहीं है। निम्नलिखित चेतावनी के साथ:

  • सामान्य जावा क्रमांकन के साथ
    • कोडिंग और डिकोडिंग एक इनपुटस्ट्रीम और आउटपुटस्ट्रीम पर चलते हैं
    • प्रक्रिया फेमिलर राइटऑबजेक्ट और रीडऑब्जेक्ट विधियों का उपयोग करती है
  • सामान्य जावा क्रमांकन के विपरीत
    • एन्कोडिंग लेकिन डिकोडिंग के कारण निर्माणकर्ता और इनिशियलाइज़र को भी आमंत्रित किया जा सकता है
    • एन्कोडिंग और डिकोडिंग की परवाह किए बिना काम करता है अगर आपकी कक्षा सीरियल योग्य हो या न हो
    • क्षणिक संशोधनों को ध्यान में नहीं रखा जाता है
    • केवल सार्वजनिक वर्गों के लिए काम करता है, जिसमें सार्वजनिक निर्माता हैं

उदाहरण के लिए, निम्नलिखित घोषणा लें:

public class NPair {
  public NPair() { }
  int number1 = 0;
  int number2 = 0;
  public void setNumber1(int value) { number1 = value;}
  public int getNumber1() { return number1; }
  public void setNumber2(int value) { number2 = value; }
  public int getNumber2() {return number2;}
}

इस कोड को निष्पादित करना:

NPair fe = new NPair();
fe.setNumber1(12);
fe.setNumber2(13);
FileOutputStream fos1 = new FileOutputStream("d:\\ser.xml");
java.beans.XMLEncoder xe1 = new java.beans.XMLEncoder(fos1);
xe1.writeObject(fe);
xe1.close();

निम्नलिखित फ़ाइल में परिणाम होगा:

<?xml version="1.0" encoding="UTF-8"?>
<java version="1.7.0_02" class="java.beans.XMLDecoder">
 <object class="NPair">
  <void property="number1">
   <int>12</int>
  </void>
  <void property="number2">
   <int>13</int>
  </void>
 </object>
</java>

ध्यान रखें कि java.beans.XMLDecoderउपयोगकर्ता द्वारा आपूर्ति किए गए डेटा के साथ उपयोग करने से आपके कोड में मनमाने ढंग से कोड निष्पादन कमजोरियां आ सकती हैं।
aventurin

2

यदि आपके पास अपने XML के लिए स्कीमा है, तो XMLBeans बहुत अच्छा काम करता है। यह स्कीमा के लिए जावा ऑब्जेक्ट बनाता है और पार्स विधियों का उपयोग करना आसान बनाता है।


0

यदि आप वस्तुओं के स्वचालित XML क्रमांकन के बारे में बात कर रहे हैं, तो Castor देखें :

कैस्टर जावा [tm] के लिए एक ओपन सोर्स डेटा बाइंडिंग फ्रेमवर्क है। यह जावा ऑब्जेक्ट्स, XML डॉक्यूमेंट और रिलेशनल टेबल के बीच सबसे छोटा रास्ता है। कैस्टर जावा-टू-एक्सएमएल बाइंडिंग, जावा-टू-एसक्यूएल दृढ़ता और बहुत कुछ प्रदान करता है।


0

आमतौर पर मैं jaxb या XMLBeans का उपयोग करता हूं अगर मुझे XML से संबंधित धारावाहिक बनाने की आवश्यकता होती है। अब, मैं देख सकता हूँ कि XStream बहुत उपयोगी हो सकता है क्योंकि यह गैर-लाभकारी है और वास्तव में सरल एपीआई है। मैं जल्द ही इसके साथ खेलूंगा और शायद इसका इस्तेमाल करूंगा। एकमात्र दोष मैंने देखा कि मैं क्रॉस रेफ़रिंग के लिए अपने दम पर ऑब्जेक्ट आईडी नहीं बना सकता।

@Barak Schiller
XStream की लिंक पोस्ट करने के लिए धन्यवाद!


समस्या jaxb है और xmlbeans को एक मैपिंग स्कीमा और
आर्क


0

यदि आप एक संरचित समाधान (जैसे ORM) चाहते हैं तो JAXB2 एक अच्छा समाधान है।

यदि आप DOT NET जैसे क्रमांकन चाहते हैं तो आप JavaBeans Components की दीर्घकालिक दृढ़ता का उपयोग कर सकते हैं

चुनाव क्रमांकन के उपयोग पर निर्भर करता है।


-1
public static String genXmlTag(String tagName, String innerXml, String properties )
{
    return String.format("<%s %s>%s</%s>", tagName, properties, innerXml, tagName);
}

public static String genXmlTag(String tagName, String innerXml )
{
    return genXmlTag(tagName, innerXml, "");
}

public static <T> String serializeXML(List<T> list)
{
    String result = "";
    if (list.size() > 0)
    {
        T tmp = list.get(0);
        String clsName = tmp.getClass().getName();
        String[] splitCls = clsName.split("\\.");
        clsName = splitCls[splitCls.length - 1];
        Field[] fields = tmp.getClass().getFields();

        for (T t : list)
        {
            String row = "";
            try {
                for (Field f : fields)
                {
                    Object value = f.get(t);
                    row += genXmlTag(f.getName(), value == null ? "" : value.toString());
                }
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
            row = genXmlTag(clsName, row);

            result += row;
        }
    }

    result = genXmlTag("root", result);
    return result;
}

कई समस्याएं: कक्षा का पुनर्निवेश # getSimpleName *** संपत्ति का पुन: आविष्कार वर्ग और फ़ाइल नाम) *** कोई deserialization
toolforger
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.