2009-10-17 12 views
5

ग्रीटिंग्स!JAXB unmarshall <string> foobar</string>

<string xmlns="...">foobar</string> 

मैं JAXB के लिए नया हूँ और यह छोड़कर, काम कर सामान का एक बहुत मिल गया है: मैं अपने ग्राहक के लिए एक सर्वर लौटने एक्सएमएल सामग्री है कि इस तरह दिखता है। मैंने सोचा कि यह स्ट्रिंग से और उसके लिए मार्शल और अनमशाल के लिए बहुत आसान होगा। यह कुछ समय लिया, लेकिन मैं अंत में पता लगा है कि कैसे के रूप में

public static String ToXML(String s) throws Exception 
    { 
     JAXBContext context = JAXBContext.newInstance(String.class); 
     Marshaller marshaller = context.createMarshaller(); 
     StringWriter sw = new StringWriter(); 
     marshaller.marshal(new JAXBElement(new QName("", "String"), String.class, s), sw); 

     return sw.toString(); 
    } 

तो मेरे सवाल, कैसे मैं इस unmarshal लिए है इस मार्शल करने के लिए? इसे रूट तत्व के रूप में एनोटेट नहीं किया जा सकता है। मैं javaBClxtxt का एक नया उदाहरण बनाने के लिए पैकेज के रूप में java.lang का उपयोग नहीं कर सकता (मुझे ऑब्जेक्ट फैक्टरी अनुपलब्ध अपवाद मिलता है)।

प्रदान करने के लिए कोई ज्ञान? यह मुश्किल नहीं हो सकता है, है ना?

उत्तर

3

जब आप JAXB का उपयोग कर रहे हैं, तो आपको एक XML स्कीमा के आसपास कोड बनाना होगा। यही है, अगर आपके पास फ़ाइल है, तो foo.xsd कहें, आपको इसे xjc कंपाइलर के माध्यम से चलाने की आवश्यकता है (डिफ़ॉल्ट रूप से जेडीके 6 में, अन्यथा आप JAXB 2 डाउनलोड कर सकते हैं और इसका उपयोग कर सकते हैं)। यह स्कीमा के माध्यम से पढ़ेगा और स्कीमा के तत्वों के साथ जावा बीन और संबंधित ऑब्जेक्ट फैक्ट्री कक्षाएं उत्पन्न करेगा। जावा बीन कक्षाएं एनोटेशन के साथ नियमित पीओजेओ की तरह दिखाई देंगी। XML को संबंधित जावा बीन में परिवर्तित करने के लिए जेएक्सबी कार्यान्वयन द्वारा ऑब्जेक्ट फैक्ट्री कक्षाओं की आवश्यकता होती है। यह आपके ऑब्जेक्ट फैक्टरी अनुपलब्ध अपवाद बताता है।

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

+1

एक एक्सएमएल स्कीमा जेएक्सबी के साथ पूरी तरह से वैकल्पिक है। यह आपके ऑब्जेक्ट मॉडल को हाथ से एनोटेट करने के लिए पूरी तरह से स्वीकार्य है। – skaffman

+0

सच है, लेकिन ऑब्जेक्ट्स का स्कीमा-जेनरेटेड सेट होने से दस्तावेज़ में शुद्धता सुनिश्चित होती है (दस्तावेज़ को स्कीमा के विरुद्ध सत्यापित किया जा सकता है) और जावा ऑब्जेक्ट्स (फ़ील्ड को मिस करना आसान है)। आप प्रक्रिया को कई अनुप्रयोगों और मशीनों में भी दोहरा सकते हैं। –

10

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

कोशिश कुछ:

@XmlRootElement(name="string", namespace="blah") 
public class MyString { 
    @XmlValue 
    String value; 
} 

JAXBContext context = JAXBContext.newInstance(MyString.class); 
MyString myString = (MyString) context.createUnmarshaller().unmarshal(...); 

यह XML <string xmlns="blah">foobar</string> unmarshal होगा। तदनुसार नामस्थान बदलें। यदि आपके पास कई नामस्थान हैं, तो JAXB वास्तव में आपके लिए टूल नहीं है।

7

मैं इस से हैरान था, लेकिन निम्नलिखित काम करने के लिए लगता है:

final String xmlString = "<string>value</string>"; 
final StringReader xmlReader = new StringReader(xmlString); 
final StreamSource xmlSource = new StreamSource(xmlReader); 
final JAXBContext jaxbContext = JAXBContext.newInstance(String.class); 
final Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); 
final String stringValue = unmarshaller.unmarshal(xmlSource, String.class).getValue(); 

कि क्या आप के लिए देख रहे थे?