从XML在Android中列出反序列化/解组泛型列表 [英] Deserialize / unmarshal generic list from XML to list in Android

查看:320
本文介绍了从XML在Android中列出反序列化/解组泛型列表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我做了Java中的web服务与返回一个字符串(泛型列表XM​​L格式)的方法。我使用来自Android的此WebService,我得到这个字符串,但几次尝试后Android模拟器尝试反序列化字符串时只是崩溃。这是一个字符串,我得到一个例子:

 <?XML版本=1.0编码=UTF-8独立=YES&GT?;
< peliculas>
    <&PELICULA GT;
        <&ID GT; 18329< / ID>
        &LT;&海报GT; HTTP://cache-cmx.netmx.mx/image/muestras/5368.rrr.jpg< /海报&GT;
        &LT;&TITULO GT; 007 Operaci&放大器;放大器; oacute; N 007:大破天幕杀机&LT; / TITULO&GT;
    &LT; / PELICULA&GT;
...
&LT; / peliculas&GT;

这是在web服务类:

  @XmlRootElement
公共类Peliculas {    @XmlElement(NAME =PELICULA)
    保护列表与LT; PELICULA&GT; peliculas;
    公共Peliculas(){peliculas =新的ArrayList&LT;&PELICULA GT;();}    公共Peliculas(列表&LT;&PELICULA GT; PE){
        peliculas = PE;
    }
    公开名单&LT;&PELICULA GT;的GetList(){
        返回peliculas;
    }    公共无效添加(PELICULA PELICULA){
        peliculas.add(PELICULA);
    }
}

________EDIT______________

好像你不能与Android使用JAXB,并有更好/更轻库这一点。所以我想简单的XML。这是方法:

 公共Peliculas解组(XML字符串)抛出异常{
    Peliculas peliculas =新Peliculas();
    串行串行=新的持留();
    StringBuffer的xmlStr =新的StringBuffer(XML);
    peliculas = serializer.read(Peliculas.class,(新StringReader(xmlStr.toString())));
    返回peliculas;
}

但我得到这个异​​常,好像它不能保存对象数据:

  20 11-12:30:10.898:I /错误(1058):元素PELICULA'没有在课堂上app.cinemexservice.Pelicula比赛在第3行


解决方案

我用SAX解析该文件,然后手动将其转换为一个对象。这是code:

 公开名单&LT;&PELICULA GT;解组(XML字符串)抛出异常{
        清单&LT;&PELICULA GT; peliculas =新的ArrayList&LT;&PELICULA GT;();
        InputStream为=新ByteArrayInputStream进行(xml.getBytes(UTF-8));
        XmlPullParser解析器= Xml.newPullParser();
        的char []℃;
        串ID =,TITULO =,海报=,atributo =;
        INT DATOS = 0;
        尝试{
            parser.setInput(是,UTF-8);
            INT事件= parser.next();
        而(事件!= XmlPullParser.END_DOCUMENT){
            如果(事件== XmlPullParser.START_TAG){
                Log.d(TAG,&下;+ parser.getName()+&gt;中);
                atributo = parser.getName();
                的for(int i = 0; I&LT; parser.getAttributeCount();我++){
                    Log.d(TAG,\\ t的+ parser.getAttributeName(I)+=+ parser.getAttributeValue(ⅰ));
                }
            }
            如果(事件== XmlPullParser.TEXT&放大器;&放大器;!parser.getText()修剪()长度()= 0)
            {
                Log.d(TAG,\\ t \\ t+ parser.getText());
                如果(atributo ==ID){ID = parser.getText(); DATOS ++;}
                否则,如果(atributo ==TITULO){TITULO = parser.getText(); DATOS ++;}
                否则,如果(atributo ==海报){海报= parser.getText(); DATOS ++;}
                如果(DATOS == 3){peliculas.add(新PELICULA(ID,TITULO,海报)); DATOS = 0;}
            }
                如果(事件== XmlPullParser.END_TAG)
                    Log.d(TAG,&所述; /+ parser.getName()+&gt;中);
                事件= parser.next();            is.close();
        }
        }赶上(例外五){Toast.makeText(这一点,e.getMessage(),Toast.LENGTH_LONG).show(); }
        对于(PELICULA号码:peliculas){
            Log.d(PELICULA恩LISTA:p.titulo);
        }
        返回peliculas;
    }

这是太长了我的口味,但我就是无法找出简单的XML,以配合我的课。

I made a webservice in java with a method that returns a string (a generic list in XML format). I consume this webservice from Android, and I get this string, but after several tries the Android emulator just crashes when trying to deserialize the string. This is an example for the string I get:

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

This is the class in the 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______________

Seems like you can't use JAXB with Android, and there's better/lighter libraries for that. so I tried Simple XML. This is the method:

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

BUT I get this exception, seems like it can't save data in object:

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

解决方案

I used SAX to parse the file, and then convert it manually to an object. This is the 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;
    }

It's way too long for my taste, but I just couldn't figure out Simple XML to match my classes.

这篇关于从XML在Android中列出反序列化/解组泛型列表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆