Android 3.1 XML-разбор NullPointerException - PullRequest
1 голос
/ 28 июля 2011

У меня есть код, написанный для Android 2.2, который должен анализировать xml с веб-страницы в строку.Он отлично работает на эмуляторе Android 2.2, но дает мне исключение NullPointerException на моем планшете Android 3.1.Вот код:

Log.d("refreshMeta", "refreshing meta.");
            url = new URL("http://www.chineseoutreach.ca/media/Cstreaming.xml");
            URLConnection connection;
            connection = url.openConnection();

            HttpURLConnection httpConnection = (HttpURLConnection)connection;
            int responseCode = httpConnection.getResponseCode();

            if (responseCode == HttpURLConnection.HTTP_OK) {
                InputStream in = httpConnection.getInputStream();
                Log.d("Connection","connected");
                DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
                DocumentBuilder db = dbf.newDocumentBuilder();

                Document dom = db.parse(in);
                Element docEle = dom.getDocumentElement();
                NodeList nl = docEle.getElementsByTagName("nowplaying");
                Element entry = (Element)nl.item(0);

                try {
                    Element eartist = (Element)entry.getElementsByTagName("artist").item(0);
                sartist = eartist.getFirstChild().getNodeValue();
                Log.d("Artist",sartist);
                }
                catch(NullPointerException e) {
                    sartist = "";
                    Log.d("Connection",e.toString());
                }

Вход в Android 3:

refreshmeta: обновление мета.

Подключение: подключено

Подключение: java.lang.NullPointerException

РЕДАКТИРОВАТЬ Это строка, которая вызывает его.Элемент eartist = (Элемент) entry.getElementsByTagName ("artist"). Item (0);

Правка 2

07-28 13: 10: 01.483: ОШИБКА / Нуль (6189):мое сообщение

07-28 13: 10: 01.483: ОШИБКА / Нуль (6189): java.lang.NullPointerException

07-28 13: 10: 01.483: ОШИБКА / Ноль (6189): в com.ciam.app.CiamInfoActivity.refreshMeta (CiamInfoActivity.java:280)

07-28 13: 10: 01.483: ОШИБКА / Нуль (6189): в com.ciam.app.CiamInfoActivity.access$ 0 (CiamInfoActivity.java:257)

07-28 13: 10: 01.483: ОШИБКА / Нуль (6189): на com.ciam.app.CiamInfoActivity $ 2.Run (CiamInfoActivity.java:123) 07-28 13: 10: 01.483: ОШИБКА / Нуль (6189): at java.lang.Thread.run (Thread.java:1020)

Я подозреваю, что существуют некоторые различия между способом анализа xml на Android2 android 3. Есть идеи?Заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 29 июля 2011

В вашем коде есть небольшая ошибка. Я не очень понимаю, почему это работает с Android 2.1 эму, но это не должно было. Ваша проблема заключалась в том, что вы делали dom.getDocumentElement (). Эта функция вернет базовый тег вашего xml-файла, который в данном случае «проигрывается». И тогда вы делаете "docEle.getElementsByTagName (" nowplaying ");" за это.

Если вы хотите быть уверенным, что «сейчас играете», вы должны сделать «dom.getElementsByTagName (« сейчас играем »)».

Исправленная версия:

Document dom = db.parse(in);
Element docEle = (Element)dom.getElementsByTagName("nowplaying").item(0);
Element eartist = (Element)docEle.getElementsByTagName("artist").item(0);
Element etitle = (Element)docEle.getElementsByTagName("title").item(0);
Log.d("Artist", eartist.getTextContent());
Log.d("Title", etitle.getTextContent());
0 голосов
/ 11 февраля 2012

У меня похожая проблема, и я наткнулся на эту страницу. По моим наблюдениям, поведение getElementsByTagName отличается в разных версиях Android.

В версии 2 результат включается сам, если у него есть указанный тег. В вашем случае, я полагаю, переменная "docEle" имеет тег "сейчас играет", поэтому она отлично работает.

В версии 3, результат поиска только от потомков, поэтому он не включает себя (docEle). Так что «нл» действительно пусто.

В соответствии со спецификацией, вер 3 является ожидаемым поведением. Это кажется очень важным, но никто не упомянул об этом. Или я могу ошибаться ...

0 голосов
/ 28 июля 2011

Я не совсем уверен, но это может быть связано со ссылкой, так как он может установить соединение, но не может найти файл ... Попробуйте войти, если он может найти xml, на который указывает URL.

Если не удается найти файл, попробуйте удалить расширение .xml, возможно, оно работает.

...