7

文字列(XML形式のジェネリックリスト)を返すメソッドを使用して、JavaでWebサービスを作成しました。このWebサービスをAndroidから使用し、この文字列を取得しましたが、数回試行した後、文字列を逆シリアル化しようとすると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>

これはWebサービスのクラスです。

@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を使用することはできないようですが、そのためのより優れた/より軽いライブラリがあります。そこで、SimpleXMLを試しました。これは方法です:

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
4

2 に答える 2

1

私はあなたが正しいことをしていると思います、APIで与えられたこのコードを試してください。

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

オブジェクトoを自分のタイプにキャストできると思います。こちらをご参照ください。http://jaxb.java.net/nonav/2.2.4/docs/api/javax/xml/bind/Unmarshaller.html

于 2012-11-12T01:44:07.587 に答える
0

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

私の好みには長すぎますが、クラスに一致するSimpleXMLを理解できませんでした。

于 2012-11-13T21:22:56.450 に答える