从XML在Android中列出反序列化/解组泛型列表 [英] Deserialize / unmarshal generic list from XML to list in Android
问题描述
我做了Java中的web服务与返回一个字符串(泛型列表XML格式)的方法。我使用来自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&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屋!