2012-11-11 18 views
7

Bir dize (XML biçiminde genel liste) döndüren bir yöntemle java'da bir web servisi hazırladım. Bu web servisini Android'den tüketiyorum ve bu dizeyi aldım, ancak birkaç denemeden sonra Android emülatörü dizgiyi silmeye çalışırken çöküyor. Bu dize için bir örnektir alıyorum:XML'den deserialize/unmarshal genel listesi Android'de listelenecek

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

__ _ __ _ __DÜZENLEME:

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

Bu webservice içinde sınıftır _ __ _ __ _ __ _ __ _ _ Eğer Android ile JAXB kullanamazsınız gibi

görünüyor ve daha iyi/daha hafif kütüphaneler bunun için var. Ben de basit XML denedim. Bu yöntem: verilmektedir bu kodu deneyin

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

cevap

0

Dosyayı ayrıştırmak için SAX ve sonra el ile bir nesneyi el ile dönüştürdüm. Bu kodu verilmiştir:

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

Benim tatmak için yol çok uzun, ama sadece benim sınıfları maç için Basit XML çözemedim.

1

Sana doğru yaptığını düşünüyorum:

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

ANCAK bu istisna olsun, bu nesnedeki verileri kaydetmek olamaz gibi görünüyor API.

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

Objektifi o türüne bastırabilirsiniz. Lütfen buna bakın. http://jaxb.java.net/nonav/2.2.4/docs/api/javax/xml/bind/Unmarshaller.html

+0

Android ile JAXB'yi kullanamayacağınız gibi görünüyor ve bunun için daha iyi/daha açık kitaplıklar var ... bu yüzden Basit XML'yi denedim. – Pundia

İlgili konular