2012-11-11 12 views
7

मैंने जावा में एक विधि के साथ एक webservice बनाया है जो एक स्ट्रिंग (एक्सएमएल प्रारूप में एक सामान्य सूची) देता है। मैं एंड्रॉइड से यह webservice का उपभोग करता हूं, और मुझे यह स्ट्रिंग मिलती है, लेकिन कई कोशिशों के बाद स्ट्रिंग को deserialize करने की कोशिश करते समय एंड्रॉइड एमुलेटर बस दुर्घटनाग्रस्त हो जाता है। इस स्ट्रिंग के लिए एक उदाहरण है मैं:एंड्रॉइड में एक्सएमएल से सूची में Deserialize/unmarshal जेनेरिक सूची

@XmlRootElement 
public class Peliculas{ 

    @XmlElement(name="pelicula") 
    protected List<Pelicula> peliculas; 
    public Peliculas(){ peliculas = new ArrayList<Pelicula>();} 

    public Peliculas(List<Pelicula> pe){ 
     peliculas = pe; 
    } 


    public List<Pelicula> getList(){ 
     return peliculas;  
    } 

    public void add(Pelicula pelicula) { 
     peliculas.add(pelicula); 
    } 
} 

__ _ __ _ __संपादित:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<peliculas> 
    <pelicula> 
     <id>18329</id> 
     <poster>http://cache-cmx.netmx.mx/image/muestras/5368.rrr.jpg</poster> 
     <titulo>007 Operaci&amp;oacute;n Skyfall</titulo> 
    </pelicula> 
... 
</peliculas> 

इस वेब सेवा में वर्ग है _ __ _ __ _ __ _ __ _ _

लगता है जैसे आप Android के साथ JAXB उपयोग नहीं कर सकते हैं, और वहाँ उस के लिए बेहतर/लाइटर पुस्तकालयों है। इसलिए मैंने सरल एक्सएमएल की कोशिश की। इस विधि है:

public Peliculas unmarshal(String xml) throws Exception{    
    Peliculas peliculas = new Peliculas(); 
    Serializer serializer = new Persister(); 
    StringBuffer xmlStr = new StringBuffer(xml); 
    peliculas = serializer.read(Peliculas.class, (new StringReader(xmlStr.toString())) ); 
    return peliculas; 
} 

लेकिन मैं इस अपवाद मिलता है, लगता है जैसे कि यह वस्तु में डेटा नहीं बचा सकते हैं:

11-12 20:30:10.898: I/Error(1058): Element 'Pelicula' does not have a match in class app.cinemexservice.Pelicula at line 3 

उत्तर

0

मैंने फ़ाइल का विश्लेषण करने के लिए SAX का उपयोग किया, और फिर इसे किसी ऑब्जेक्ट में मैन्युअल रूप से रूपांतरित कर दिया। यह कोड है:

public List<Pelicula> unmarshal(String xml) throws Exception{   
     List<Pelicula> peliculas = new ArrayList<Pelicula>();  
     InputStream is = new ByteArrayInputStream(xml.getBytes("UTF-8")); 
     XmlPullParser parser = Xml.newPullParser(); 
     char[] c; 
     String id="", titulo="", poster="", atributo=""; 
     int datos =0; 
     try{ 
      parser.setInput(is, "UTF-8"); 
      int event = parser.next(); 
     while(event != XmlPullParser.END_DOCUMENT) { 
      if(event == XmlPullParser.START_TAG) { 
       Log.d(TAG, "<"+ parser.getName() + ">"); 
       atributo = parser.getName(); 
       for(int i = 0; i < parser.getAttributeCount(); i++) { 
        Log.d(TAG, "\t"+ parser.getAttributeName(i) + " = "+ parser.getAttributeValue(i)); 
       } 
      } 
      if(event == XmlPullParser.TEXT&& parser.getText().trim().length() != 0) 
      { 
       Log.d(TAG, "\t\t"+ parser.getText()); 
       if (atributo=="id"){id=parser.getText(); datos++;} 
       else if(atributo=="titulo"){titulo=parser.getText(); datos++;} 
       else if(atributo=="poster"){poster=parser.getText(); datos++;} 
       if(datos==3){peliculas.add(new Pelicula(id, titulo, poster)); datos=0;} 
      } 
       if(event == XmlPullParser.END_TAG) 
        Log.d(TAG, "</"+ parser.getName() + ">");    
       event = parser.next(); 

      is.close(); 
     } 
     } catch(Exception e) { Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show(); }   
     for (Pelicula p : peliculas){ 
      Log.d("Película en lista: ", p.titulo); 
     }   
     return peliculas; 
    } 

यह मेरे स्वाद के लिए बहुत लंबा तरीका है, लेकिन मैं अपने वर्गों से मेल खाने के लिए सरल एक्सएमएल नहीं समझ सका।

1

मुझे लगता है कि आप सही कर रहे हैं, इस कोड को जो में दी गई है की कोशिश करो एपीआई

JAXBContext jc = JAXBContext.newInstance("add your class's full qualified class name here"); 
Unmarshaller u = jc.createUnmarshaller(); 
Object o = u.unmarshal(xmlSource); 

आप ऑब्जेक्ट ओ को अपने प्रकार के बारे में सोच सकते हैं। कृपया इसे देखें। http://jaxb.java.net/nonav/2.2.4/docs/api/javax/xml/bind/Unmarshaller.html

+0

ऐसा लगता है कि आप एंड्रॉइड के साथ जेएक्सबी का उपयोग नहीं कर सकते हैं, और उसके लिए बेहतर/हल्का पुस्तकालय है ... इसलिए मैंने सरल एक्सएमएल की कोशिश की। – Pundia

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