2011-03-27 22 views
8

मैं XML में हेरफेर करने के लिए xStream का उपयोग कर रहा हूं। सब ठीक है। एक्सएमएल संग्रह और अन्य चीजों को रखने के लिए। लेकिन, मुझे एक समस्या है:xStream समस्याएं - एकाधिक ऑब्जेक्ट्स को deserialize कैसे करें

उदाहरण: मेरे एक्सएमएल में एक टैग है, और इसके अंदर, मेरे पास <comment> नामक कुछ और टैग हैं। एक उदाहरण कोड देखें:

<comments> 
    <comment> 
     <id>1</id> 
     <desc>A comment</desc> 
    </comment> 
    <comment> 
     <id>2</id> 
     <desc>Another comment</desc> 
    </comment> 
    <comment> 
     <id>3</id> 
     <desc>Another one comment</desc> 
    </comment> 
</comments> 

और प्रगतिशील। मैं टैग के अंदर 500 टैग कर सकता हूं। और ये टिप्पणियां प्रकार की टिप्पणी हैं।

कक्षाओं में इन सभी टैग को रखने के लिए मैं xStream के साथ क्रमबद्ध करने के लिए कैसे कर सकता हूं? मैं इस वर्ग में विभिन्न वस्तुओं को प्राप्त करने के लिए कैसे नहीं करता हूं।

जाहिर है, मैं इसे एक ऐरे या कुछ अन्य के साथ बनाउंगा। लेकिन मुझे नहीं पता कि मैं यह कैसे कर सकता हूं। ,

XStream xstream = new XStream(); 
xstream.alias("comments", Comments.class); 
xstream.alias("comment", Comment.class); 
xstream.addImplicitCollection(Comments.class, "comments"); 
Comments comments = (Comments)xstream.fromXML(xml); 

Additionaly के रूप में निशान में उल्लेख किया है:

public class Comment { 
    long id 
    String desc 
} 

public class Comments { 
    List<Comment> comments = new ArrayList<Comment>(); 
} 

आपका unmarshalling तर्क तो की तरह कुछ होगा:

+2

आपका एक्सएमएल दिखता है थोड़ा सा ' 'टैग'' टैग के साथ समाप्त होना चाहिए, और ' 'टैग नहीं होना चाहिए। साथ ही, यह वही है जो आप ढूंढ रहे हैं: http://stackoverflow.com/questions/3136234/xstream-root-as-a-collection-of-objects? – Nishan

+0

[यह प्रश्न] (http://stackoverflow.com/questions/3824362/xstream-alias-of-list-root-elements) भी समान है। –

उत्तर

12

कि XML के लिए, आप शायद एक वर्ग संरचना के लिए की तरह लग रही होगी टिप्पणियां, आपका एक्सएमएल सही ढंग से गठित नहीं हुआ है। आपको यह सुनिश्चित करना होगा कि <comment></comment> के साथ समाप्त होता है और </comments> नहीं है। इस उत्तर में दिए गए किसी भी कोड से पहले आपको इसे ठीक करने की आवश्यकता होगी।

+0

ओह, हाँ। धन्यवाद। इस XML में जो मैं यहां पोस्ट करता हूं, मैं इसे मैन्युअल रूप से सरल बना देता हूं। एक्सएमएल सही है। सभी टैग सही टैग बंद कर रहे हैं। उत्तर के लिए धन्यवाद। –

+0

@ रोब ह्रस्का मुझे पता है कि थोड़ा देर हो चुकी है, लेकिन मैं XML फ़ाइल स्थान कैसे निर्दिष्ट करूं? – Twhite1195

+0

@ Twhite1195 एक्सएमएल को FileInputStream या कुछ से पढ़ा जाना चाहिए। –

1

यदि आप एकाधिक ऑब्जेक्ट्स से निपटते हैं, तो आप प्रत्येक ऑब्जेक्ट को प्राप्त करने के लिए fromXML (InputStream इन) कई बार कॉल करने की उम्मीद कर सकते हैं। यह विधि अपेक्षा के अनुसार संभाल नहीं पाती है और यदि आप ऐसा करते हैं तो खराब शब्द वाले अपवाद संदेश को फेंकता है। वैकल्पिक रूप से, सभी ऑब्जेक्ट्स को एक बड़े ऑब्जेक्ट में लपेटने से प्रोग्राम अधिक वांछित उपयोग कर सकता है, फिर वांछित या स्मृति से बाहर चला जाता है।

इसे ठीक करने के लिए, मैंने एक सामान्य उपयोगिता विधि बनाई ताकि मैं प्रत्येक छोटी वस्तु को अपनी स्ट्रिंग में पार्स कर सकूं ताकि मैं fromXML(String) विधि और आकार में स्केल कर सकूं।

उदाहरण कॉल:

String element = next(in, "</MyObject>"); 
MyObject o = (MyObject)xstream.fromXML(element); 

public static String next(InputStream in, String occurence) throws IOException { 
     StringBuffer sb = new StringBuffer(); 
     int i; 
     int pos = 0; 
     while((i = in.read()) != -1) { 
      sb.append((char)i); 
      if(i == occurence.charAt(pos)) { 
       pos ++; 
      } else 
       pos = 0; 

      if(pos == occurence.length()) 
       return sb.toString(); 
     } 
     return null; 
    } 
7

हालांकि यह एक पुराने धागा है, लेकिन यहाँ एनोटेट संस्करण है:

@XStreamAlias("comment") 
public class Comment { 
    long id 
    String desc 
} 

@XStreamAlias("comments") 
public class Comments { 
    @XStreamImplicit(itemFieldName = "comment") 
    List<Comment> comments; 
} 

unmarshal करने के लिए आप इस की जरूरत है:

XStream xStream = new XStream(); 
xStream.processAnnotations(new Class[] { Comments.class, Comment.class }); 
Comments comments = (Comments)xStream.fromXML(xml); 
संबंधित मुद्दे