我做了Java中的web服务与返回一个字符串(泛型列表XML格式)的方法。我使用来自Android的此WebService,我得到这个字符串,但几次尝试后Android模拟器尝试反序列化字符串时只是崩溃。这是一个字符串,我得到一个例子:
&LT;?XML版本=1.0编码=UTF-8独立=YES&GT?;&LT; peliculas&GT; &LT;&PELICULA GT; &LT;&ID GT; 18329&LT; / ID&GT; &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, "tt"+ 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.
相关推荐
最新文章