Я разрабатываю приложение для Android, я бы прочитал XML-файл из Интернета, но он не работает. Я новичок в Android и не знаю, почему это не работает. Это мой код, пожалуйста, не могли бы мне помочь?

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    intent = getIntent();

    try {

        FilmList = new ArrayList<MyFilm>();

        XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
        factory.setNamespaceAware(true);
        XmlPullParser xpp = factory.newPullParser();

        URL input = new URL("URL");
        xpp.setInput(input.openStream(), null);

        int eventType = xpp.getEventType();
        String currentTag = null;

        String title = null;
        while (eventType != XmlPullParser.END_DOCUMENT) {
            if (eventType == XmlPullParser.START_TAG) {
                currentTag = xpp.getName();
            } else if (eventType == XmlPullParser.TEXT) {
                if ("title".equals(currentTag)) {
                    title = xpp.getText();
                    FilmList.add(new MyFilm(title));
                }
            } 
            }
            eventType = xpp.next();



        adapter = new FilmsAdapterView(this,FilmList);
        setListAdapter(adapter);
    }
    catch (Exception e) {
        e.printStackTrace();
    }
}

А это мой XML-файл.

<?xml version="1.0" encoding="utf-8"?>
<root>
<movie>
    <number>
        1
    </number>
    <o_title>
        Godfather, The
    </o_title>
    <title>
        Il padrino
    </title>
    <director>
        Francis Ford Coppola
    </director>
    <year>
        1972
    </year>
    <classification>

    </classification>
    <country>
        USA
    </country>
    <genre>
        Drammatico
    </genre>
    <rating>
        9
    </rating>
    <runtime>
        175
    </runtime>
    <studio>

    </studio>
    <seen>
        1
    </seen>
    <loaned>
        0
    </loaned>
    <o_site>

    </o_site>
    <site>
        http://www.mymovies.it/dizionario/recensione.asp?id=17401
    </site>
    <trailer>
        http://www.mymovies.it/trailer/?id=17401
    </trailer>
    <plot>
        Quando nel 1945, dopo aver dominato per due generazioni un clan di mafia italoamericana,     Don Vito Corleone muore, suo figlio Michael accetta con riluttanza di occuparsi degli affari di famiglia. Imparerà presto. Da un romanzo (1969) di Mario Puzo che l'ha sceneggiato con il regista, è la storia di un sistema familiare e di clan con sottofondo nostalgico per la forza di quei legami che nell'America di oggi sembrano svalutati (come fu letto dalla maggioranza del pubblico), ma possiede anche una profonda e fertile ambiguità. C'è il parallelismo mafia-politica che diventa equivalenza nel Padrino-Parte II; c'è la magistrale ricostruzione di un'epoca e di una morale del crimine, di una struttura patriarcale più italiana che americana. Coppola sa di cosa parla e ne sa le ragioni anche se non le condivide: il suo sguardo è più distaccato che affascinato. Spaccò la critica in due ed ebbe ovunque un grande successo. 7 nomine e 3 Oscar: film, sceneggiatura e M. Brando.AUTORE LETTERARIO: Mario Puzo
    </plot>
    <cast>
        Marlon Brando come Don Vito Corleone
James Caan come Sonny Corleone
Al Pacino come Michael Corleone
Robert Duvall come Tom Hagen
Diane Keaton come Kay Adams
Richard Castellano come Peter Clemenza
Sterling Hayden come Mcluskey
John Marley come Jack Woltz
Richard Conte come Don Emilio Barzini
Al Lettieri come Virgil 'il Turco' Sollozzo
Abe Vigoda come Sal Tessio
Talia Shire come Connie Rizzi
Gianni Russo come Carlo Rizzi
John Cazale come Fredo Corleone
Salvatore Corsetto come Bonasera
Rudy Bond come Cuneo
Julie Gregg come Sandra Corleone
Tony Giorgio come Bruno Tattaglia
Morgana King come Mama Corleone
Franco Citti come Calò
Richard Bright come Al Neri
Corrado Gaipa come Don Tommasino
Victor Rendina come Philip Tattaglia
Saro Urzì come Vitelli
Simonetta Stefanelli come Apollonia
Cardell Sheridan come La signora Clemenza
Vito Scotti come Nazorine
Angelo Infanti come Fabrizio
Alex Rocco come Moe Greene
Lenny Montana come Luca Brasi
John Martino come Paulie Gatto
Tere Livrano come Theresa Hagen
Jeannie Linero come Lucy Mancini
Al Martino come Johnny Fontane
Salvatore Corsitto come Bonasera
Ardell Sheridan come Mrs. Clemenza
    </cast>
    <notes>

    </notes>
    <poster_md5>

    </poster_md5>
    <volumes_name>

    </volumes_name>
    <collections_name>

    </collections_name>
    <media_name>

    </media_name>
    <image>

    </image>
</movie>
<movie>
    <number>
        2
    </number>
    <o_title>
        Lucy
    </o_title>
    <title>
        Lucy
    </title>
    <director>
        Luc Besson
    </director>
    <year>
        2014
    </year>
    <classification>

    </classification>
    <country>
        USA, Francia
    </country>
    <genre>
        Azione
    </genre>
    <rating>
        5
    </rating>
    <runtime>
        90
    </runtime>
    <studio>

    </studio>
    <seen>
        1
    </seen>
    <loaned>
        0
    </loaned>
    <o_site>

    </o_site>
    <site>
        http://www.mymovies.it/dizionario/recensione.asp?id=78667
    </site>
    <trailer>
        http://www.mymovies.it/trailer/?id=78667
    </trailer>
    <plot>
        Lucy è una studentessa che vive a Taiwan. Si trova costretta a consegnare una valigetta dal contenuto misterioso a un criminale coreano, Mr. Jang. Costui, una volta verificato ciò che gli è stato portato, sequestra la ragazza. Le fa inserire nel corpo uno dei pacchetti ricevuti che contiene una sostanza di cui dovrebbe essere la passiva trasportatrice. Non sarà così perché il pacchetto si rompe e il prodotto chimico viene assorbito dal suo corpo il quale progressivamente sviluppa una capacità di conoscenza e di potere inimmaginabili per chi non sia, come il professor Norman, un neuro ricercatore.

Che Luc Besson ami mettere al centro di molte sue opere personaggi femminili coinvolti in esperienze che ne mutano profondamente la vita è testimoniato dalla sua filmografia. Sappiamo  quanto sono lontane tra loro, nel tempo e nell'azione, Nikita e la Aung San Suu Kyi di The Lady ma al contempo vicine per capacità di resistenza, di forza d'animo, di sguardo verso possibili mutamenti che i maschi faticano a sostenere. Lucy si aggiunge a loro in un film che si struttura come un puzzle narrativo e visivo di cui si può cogliere la reale sostanza solo se se ne sanno pazientemente ricomporre i pezzi e si rinuncia a ricorrere agli stereotipi valutativi, che da sempre vengono applicati al cinema di Besson, per guardare più in profondità. Perché l'assunto iniziale è legato alle neuro scienze e ci ricorda che il nostro cervello ha sviluppato solo una piccolissima parte delle sue potenzialità rispetto all'homo sapiens (non dimentichiamo che Lucy è il nome che è stato dato alla prima donna di cui l'antropoarcheologia abbia conoscenza). Cosa accadrebbe se si passasse progressivamente dalla potenza all'atto, se i neuroni attivi aumentassero percentualmente? È questa la domanda iniziale su cui si innesta l'azione di una supereroina suo malgrado (come tanti personaggi Marvel) che combatte contro il Male impersonato da un cattivissimo Choi Min Sik (molti lo ricorderanno in Oldboy e in Lady Vendetta). Qui ci si possono attendere le già citate facili banalizzazioni su un Besson incapace di resistere alla tentazione fumettistico-adrenalinica (vedi la corsa in auto nel centro di Parigi e non solo). Se si guarda però più nel profondo ci si può accorgere che il più americano dei registi francesi mentre sembra servire al grande pubblico un mix di SuperQuark e di Science fiction in realtà sta esponendo una sorta di trattato sul Tao. Chiunque abbia confidenza con i principi di questa filosofia potrà ritrovarli utilizzati a marcare le tappe del percorso della protagonista. &quot;Vuota la tua mente di tutti i pensieri; lascia che il tuo cuore trovi la pace. Studia la complessità del mondo, ma contemplane il ritorno. Il ritorno alla sorgente è la serenità. Se non realizzi la fonte finirai con il confonderti e il dispiacerti. Quando comprenderai da dove provieni, diventerai naturalmente tollerante, comprensivo, multiforme&quot;. Questo si legge nel Daodejing ed è quanto si scorge in controluce in Lucy. Besson, interpellato in materia, non conferma ma neanche smentisce.
    </plot>
    <cast>
        Scarlett Johansson come Lucy
Morgan Freeman come Professor Norman
Amr Waked come Pierre Del Rio
Choi Min-sik come Kang
Pilou Asbæk come Richard
Analeigh Tipton come Caroline
Mason Lee come
Claire Tran come
Frédéric Chau come
Jan Oliver Schroeder come
Yvonne Gradelet come
Renaud Cestre come
Cedric Chevalme come
Paul Chan come
    </cast>
    <notes>

    </notes>
    <poster_md5>

    </poster_md5>
    <volumes_name>

    </volumes_name>
    <collections_name>

    </collections_name>
    <media_name>

    </media_name>
    <image>

    </image>
</movie>
</root>

Спасибо всем!!

-1
atapi19 11 Ноя 2014 в 13:43

2 ответа

Лучший ответ

Прежде всего, вы не можете получить доступ к местоположениям в Интернете без AsyncTask. Вы не можете этого сделать на главном thread. Поищи в Гугле. Во-вторых, xpp.next() нужно было поместить внутрь цикла. В-третьих, решение @ Kamuy тоже работает, но по тому же сценарию, что и ниже.

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    new WebService() {

        @Override
        protected Object doInBackground(Object... params) {
            try {
                List<String> arr = new ArrayList<String>();

                XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
                factory.setNamespaceAware(true);
                XmlPullParser xpp = factory.newPullParser();

                URL input = new URL("http://whatdowedo.altervista.org/griffith_list.xml");
                xpp.setInput(input.openStream(), null);
                //
                int eventType = xpp.getEventType();
                String currentTag = null;
                //
                String title = null;
                while (eventType != XmlPullParser.END_DOCUMENT) {
                    if (eventType == XmlPullParser.START_TAG) {
                        currentTag = xpp.getName();
                    } else if (eventType == XmlPullParser.TEXT) {
                        if ("title".equals(currentTag)) {
                            title = xpp.getText().trim();
                            if(title.length()>0) {
                                arr.add(title);
                                System.out.println(title);
                            }
                        }
                    }
                    eventType = xpp.next();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }
    }.execute();
}

abstract class WebService extends AsyncTask<Object, Void, Object> {

    public WebService() {
        super();
    }

    @Override
    protected void onPreExecute() {

    }

    @Override
    protected abstract Object doInBackground(Object... params);

    @Override
    protected void onPostExecute(Object result) {
    }

}

Замените массив String на свой FilmList, и на этом все. Просто скажи спасибо.

0
cosmincalistru 11 Ноя 2014 в 12:44

Примере:

    try {
        URL url= new URL(/*your xml url*/);
        URLConnection conn = url.openConnection();

        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        Document doc = builder.parse(conn.getInputStream());

        NodeList nodes = doc.getElementsByTagName(/*tag from xml file*/);
        for (int i = 0; i < nodes.getLength(); i++) {
            Element element = (Element) nodes.item(i);
            NodeList title = element.getElementsByTagName(/*item within the tag*/);
            Element line = (Element) title.item(0);
            phoneNumberList.add(line.getTextContent());
        }
    }
    catch (Exception e) {
        e.printStackTrace();
    }

В моем примере мой XML-файл выглядит примерно так:

<numbers>
  <phone>
     <string name = "phonenumber1">555-555-5555</string>
  </phone>
  <phone>
     <string name = "phonenumber2">555-555-5555</string>
  </phone>

И я бы заменил тег / из файла xml / на "phone" и / элемент в теге / на "string".

0
Kamuy 11 Ноя 2014 в 10:51