2012-11-11 6 views
7

Ich machte einen Webservice in Java mit einer Methode, die eine Zeichenfolge (eine generische Liste im XML-Format) zurückgibt. Ich benutze diesen Webservice von Android, und ich bekomme diese Zeichenfolge, aber nach mehreren Versuchen stürzt der Android-Emulator nur ab, wenn er versucht, die Zeichenfolge zu deserialisieren. Dies ist ein Beispiel für die Zeichenfolge ich:Deserialize/unmarshal generische Liste von XML zur Liste in Android

<?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> 

Dies ist die Klasse in den Webservice:

@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); 
    } 
} 

__ _ __ _ __EDIT_ __ _ __ _ __ _ __ _ _

Scheint, wie Sie nicht JAXB mit Android verwenden können, und es ist besser/leichte Bibliotheken dafür. also habe ich Simple XML ausprobiert. Dies ist die Methode:

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; 
} 

aber ich bekomme diese Ausnahme, wie es scheint, nicht Daten im Objekt speichern:

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

Antwort

0

Ich habe SAX verwendet, um die Datei zu analysieren und sie dann manuell in ein Objekt zu konvertieren. Dies ist der Code:

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; 
    } 

Es ist viel zu lang für meinen Geschmack, aber ich konnte einfach nicht einfache XML herauszufinden, meine Klassen entsprechen.

1

Ich glaube, Sie tun, richtig ist, diesen Code Versuchen Sie, die in gegeben die API.

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

Sie können das Objekt o zu Ihrem Typ, denke ich. Bitte beziehen Sie sich darauf. http://jaxb.java.net/nonav/2.2.4/docs/api/javax/xml/bind/Unmarshaller.html

+0

Scheint so, als könnten Sie JAXB nicht mit Android verwenden, und dafür gibt es bessere/leichtere Bibliotheken ... also habe ich Simple XML ausprobiert. – Pundia