Java Android中从XML到列表的通用列表反序列化/反汇编

Java Android中从XML到列表的通用列表反序列化/反汇编,java,android,web-services,jaxb,marshalling,Java,Android,Web Services,Jaxb,Marshalling,我用java制作了一个webservice,其中包含一个返回字符串(XML格式的通用列表)的方法。我从Android中使用这个Web服务,得到了这个字符串,但是在多次尝试之后,Android emulator在尝试反序列化字符串时崩溃了。这是我得到的字符串的一个示例: <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <peliculas> <pelicula> <id

我用java制作了一个webservice,其中包含一个返回字符串(XML格式的通用列表)的方法。我从Android中使用这个Web服务,得到了这个字符串,但是在多次尝试之后,Android emulator在尝试反序列化字符串时崩溃了。这是我得到的字符串的一个示例:

<?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>
但我遇到了这个异常,它似乎无法在对象中保存数据:

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

我认为您做的是正确的,请尝试API中给出的代码

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

我想你可以把这个对象转换成你喜欢的类型。请参考这个

我使用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;
    }
公共列表解组(字符串xml)引发异常{
List peliculas=new ArrayList();
InputStream is=newbytearrayinputstream(xml.getBytes(“UTF-8”);
XmlPullParser=Xml.newPullParser();
char[]c;
字符串id=“”,titulo=“”,poster=“”,atributo=“”;
int datos=0;
试试{
setInput(是“UTF-8”);
int event=parser.next();
while(event!=XmlPullParser.END_文档){
如果(event==XmlPullParser.START_标记){
Log.d(标记“”);
atributo=parser.getName();
对于(inti=0;i

这对我来说太长了,但我就是想不出简单的XML来匹配我的类。

似乎你不能在Android上使用JAXB,而且有更好/更轻的库来实现这一点。。。所以我尝试了简单的XML。
JAXBContext jc = JAXBContext.newInstance( "add your class's full qualified class name here" );
Unmarshaller u = jc.createUnmarshaller();
Object o = u.unmarshal( xmlSource );
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;
    }