【问题标题】:Deserialize / unmarshal generic list from XML to list in Android反序列化/解组从 XML 到 Android 列表的通用列表
【发布时间】:2012-11-11 20:08:54
【问题描述】:

我在 java 中使用返回字符串(XML 格式的通用列表)的方法创建了一个 Web 服务。我从 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>

这是网络服务中的类:

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

________编辑 ______________

似乎你不能在 Android 中使用 JAXB,并且有更好/更轻的库。所以我尝试了简单的 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;
}

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

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

【问题讨论】:

    标签: java android web-services jaxb marshalling


    【解决方案1】:

    我认为你做得对,试试 API 中给出的这段代码。

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

    您可以将 Object o 转换为我认为的类型。请参考这里。 http://jaxb.java.net/nonav/2.2.4/docs/api/javax/xml/bind/Unmarshaller.html

    【讨论】:

    • 似乎你不能在 Android 中使用 JAXB,并且有更好/更轻量级的库......所以我尝试了 Simple XML。
    【解决方案2】:

    我使用 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 来匹配我的类。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-17
      • 1970-01-01
      • 1970-01-01
      • 2016-10-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多