2011-09-23 14 views
6

मैं एक्सएमएल में HashTable<String, String> क्रमबद्ध करने के लिए जेएक्सबी का उपयोग करने की कोशिश कर रहा हूं। मैं जावा के लिए बहुत नया हूं (सी # से आया), इसलिए मैं इस काम से परेशान हूं।जेएक्सबी का उपयोग कर हैशटेबल <स्ट्रिंग, स्ट्रिंग> एक्सएमएल को क्रमबद्ध कैसे करें?

public static <T> String ObjectToXml(T object, Class<T> classType) throws JAXBException 
{ 
    JAXBContext jaxbContext = JAXBContext.newInstance(classType); 
    StringWriter writerTo = new StringWriter(); 
    Marshaller marshaller = jaxbContext.createMarshaller(); 
    marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
    marshaller.marshal(object, writerTo); //create xml string from the input object 
    return writerTo.toString(); 
} 

कौन सा की तरह तो शुरू हो जाती है:

मैं निम्नलिखित कोड को देखा है ObjectToXml(o, ClassOfO.class), लेकिन HashTable<String, String>.class गलत है (है कि मैं पहले से ही पता)।

क्या जावा गुरु यहां दिखा सकते हैं कि इस कोड को कैसे आमंत्रित किया जाए? एक सरल कार्यान्वयन का प्रस्ताव (निश्चित रूप से एक आमंत्रण उदाहरण के साथ) का भी स्वागत है।

धन्यवाद।

उत्तर

6

आप पर धारण करने के लिए एक आवरण वर्ग बनाने की आवश्यकता होगी Hashtable:

package forum7534500; 

import java.util.Hashtable; 

import javax.xml.bind.annotation.XmlRootElement; 

@XmlRootElement 
public class Wrapper { 

    private Hashtable<String, String> hashtable; 

    public Hashtable<String, String> getHashtable() { 
     return hashtable; 
    } 

    public void setHashtable(Hashtable<String, String> hashtable) { 
     this.hashtable = hashtable; 
    } 

} 

तो आप निम्न कर सकते :

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<wrapper> 
    <hashtable> 
     <entry> 
      <key>bar</key> 
      <value>B</value> 
     </entry> 
     <entry> 
      <key>foo</key> 
      <value>A</value> 
     </entry> 
    </hashtable> 
</wrapper> 
:

package forum7534500; 

import java.io.StringWriter; 
import java.util.Hashtable; 

import javax.xml.bind.JAXBContext; 
import javax.xml.bind.JAXBException; 
import javax.xml.bind.Marshaller; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     JAXBContext jc = JAXBContext.newInstance(Wrapper.class); 
     Wrapper wrapper = new Wrapper(); 
     Hashtable<String, String> hashtable = new Hashtable<String,String>(); 
     hashtable.put("foo", "A"); 
     hashtable.put("bar", "B"); 
     wrapper.setHashtable(hashtable); 
     System.out.println(objectToXml(jc, wrapper)); 
    } 

    public static String objectToXml(JAXBContext jaxbContext, Object object) throws JAXBException 
    { 
     StringWriter writerTo = new StringWriter(); 
     Marshaller marshaller = jaxbContext.createMarshaller(); 
     marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
     marshaller.marshal(object, writerTo); //create xml string from the input object 
     return writerTo.toString(); 
    } 

} 

यह निम्नलिखित उत्पादन का उत्पादन होगा

बातों का ध्यान रखना

  • JAXBContext एक धागा सुरक्षित वस्तु है और एक बार बनाया है और पुन: उपयोग किया जाना चाहिए।
  • Hashtable सिंक्रनाइज़ किया गया है, अगर आपको इसकी आवश्यकता नहीं है तो HashMap का उपयोग सामान्य प्रतिस्थापन है।
  • सम्मेलन जावा केस नामों को कम केस अक्षर के साथ शुरू करना है।

मानचित्रण अनुकूलित

आप किसी भी वर्ग की मैपिंग अनुकूलित करने के लिए JAXB में एक XmlAdapter उपयोग कर सकते हैं।

3

दुर्भाग्यवश, जेएक्सबी सीधे Map या HashMap उदाहरण सीधे क्रमबद्ध करने में सक्षम नहीं है। इसके बजाय, आपको Map से प्रविष्टियों की एक सूची में कुछ प्रकार का अनुवाद करना होगा जिसमें कुंजी और मूल्य हो। this Stack Overflow question पर देखने का प्रयास करें और देखें कि यह आपकी मदद कर सकता है या नहीं। यह समस्या Google में बहुत कुछ दिखाती है, और दुखद उत्तर यह है कि JAXB को Map को क्रमबद्ध करने का तरीका नहीं पता है।

+2

JAXB नक्शे (http://stackoverflow.com/questions/7534500/how-to-serialize-hashtablestring-string-to-xml-using-jaxb/7534671#7534671 देखें) के लिए एक डिफ़ॉल्ट मानचित्रण करता है। आपके द्वारा वर्णित रणनीति डिफ़ॉल्ट के अलावा मैपिंग निर्दिष्ट करने के लिए आवश्यक है। –

1

जबकि आप सी # संशोधित जेनरिक से परिचित हो सकते हैं, जावा के जेनेरिक केवल संकलन समय के लिए हैं, वे रनटाइम पर चले जाते हैं। यही कारण है कि, रनटाइम पर, भले ही आपके पास स्थापित जेनरिक (जैसे हैशटेबल के लिए स्ट्रिंग) के साथ एक उदाहरण है, जो कि जेनेरिक रनटाइम पर जाते हैं, इसलिए आप जो कुछ भी कर सकते हैं वह है (यहां हैशटेबल) और वास्तविक जेनेरिक नहीं प्रकार (यहां स्ट्रिंग)। संक्षेप में: संकलन समय Hashtable<String,String> रनटाइम पर HashTable हो जाता है (या, पूरी तरह से पंडिताऊ HashTable<?,?> होने के लिए)

1

मुझे लगता है कि आपका सर्वश्रेष्ठ दांव दर्शाता है कि आप क्या चाहते हैं और फिर एक xml स्कीमा बनाने के लिए है: नीचे अपने ब्लॉग पर एक पोस्ट करने के लिए एक लिंक जहाँ मैं सिर्फ इतना है कि कैसे करना है का प्रदर्शन है उस पर xjc चलाएं। इस तरह आप पर कुछ नियंत्रण है कि एक्सएमएल जेएक्सबी की हिम्मत में क्या हो रहा है। http://download.oracle.com/docs/cd/E17802_01/webservices/webservices/docs/1.6/jaxb/xjc.html

फिर आप उत्पन्न वस्तु को अपने HashTable का अनुवाद है और यह आपके स्थैतिक विधि के इस बदलाव के लिए पारित कर सकते हैं।

public static <T> String ObjectToXml(T object) throws JAXBException { 
     JAXBContext jaxbContext = JAXBContext.newInstance(object.getClass()); 
     StringWriter writerTo = new StringWriter(); 
     Marshaller marshaller = jaxbContext.createMarshaller(); 
     marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
     marshaller.marshal(object, writerTo); 
     return writerTo.toString(); 
    } 
2

बाह! आप केवल JAXB और hashmap पर googled था तो आप सीधे इस पाया है |: http://download.oracle.com/javase/6/docs/api/javax/xml/bind/annotation/adapters/XmlAdapter.html

लेकिन, हाँ, मैं एक तरह से सहमत हैं कि 'perplexion' के गैर प्रत्यक्षता की भावना का अच्छा वर्णन है काम।

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