从XML反序列化/解组通用列表以在Android中列出

Pun*_*dia 7 java android web-services jaxb marshalling

我在java中创建了一个web服务,该方法返回一个字符串(XML格式的通用列表).我从Android使用这个web服务,我得到了这个字符串,但经过几次尝试后,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>
Run Code Online (Sandbox Code Playgroud)

这是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);
    }
}
Run Code Online (Sandbox Code Playgroud)

__ _ __ _ __ 编辑_ __ _ __ _ __ _ __ _ _

看起来你不能在Android上使用JAXB,并且有更好/更轻的库.所以我尝试了Simple XML.这是方法:

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;
}
Run Code Online (Sandbox Code Playgroud)

但我得到这个异常,似乎无法保存对象中的数据:

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

Pun*_*dia 0

我使用 SAX 解析文件,然后手动将其转换为对象。这是代码:

\n\n
public List<Pelicula> unmarshal(String xml) throws Exception{           \n        List<Pelicula> peliculas = new ArrayList<Pelicula>();       \n        InputStream is = new ByteArrayInputStream(xml.getBytes("UTF-8"));\n        XmlPullParser parser = Xml.newPullParser(); \n        char[] c;\n        String id="", titulo="", poster="", atributo="";\n        int datos =0;\n        try{ \n            parser.setInput(is, "UTF-8"); \n            int event = parser.next();  \n        while(event != XmlPullParser.END_DOCUMENT) { \n            if(event == XmlPullParser.START_TAG) { \n                Log.d(TAG, "<"+ parser.getName() + ">"); \n                atributo = parser.getName();\n                for(int i = 0; i < parser.getAttributeCount(); i++) { \n                    Log.d(TAG, "\\t"+ parser.getAttributeName(i) + " = "+ parser.getAttributeValue(i)); \n                } \n            } \n            if(event == XmlPullParser.TEXT&& parser.getText().trim().length() != 0) \n            {\n                Log.d(TAG, "\\t\\t"+ parser.getText());\n                if (atributo=="id"){id=parser.getText(); datos++;}\n                else if(atributo=="titulo"){titulo=parser.getText(); datos++;}\n                else if(atributo=="poster"){poster=parser.getText(); datos++;}\n                if(datos==3){peliculas.add(new Pelicula(id, titulo, poster)); datos=0;} \n            }\n                if(event == XmlPullParser.END_TAG) \n                    Log.d(TAG, "</"+ parser.getName() + ">");               \n                event = parser.next(); \n\n            is.close();\n        }\n        } catch(Exception e) { Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show(); }        \n        for (Pelicula p : peliculas){\n            Log.d("Pel\xc3\xadcula en lista: ", p.titulo);\n        }           \n        return peliculas;\n    }\n
Run Code Online (Sandbox Code Playgroud)\n\n

对于我的口味来说,它太长了,但我就是无法找出简单的 XML 来匹配我的类。

\n