Android 3.1 XML-разбор NullPointerException

1

У меня есть код, написанный для Android 2.2, который должен анализировать xml с веб-страницы на String. Он отлично работает на эмуляторе 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

EDIT Это строка, которая вызывает ее. Элемент eartist = (Элемент) entry.getElementsByTagName("artist"). Item (0);

Изменить 2

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

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

07-28 13: 10: 01.483: ОШИБКА /Null (6189): at com.ciam.app.CiamInfoActivity.refreshMeta(CiamInfoActivity.java:280)

07-28 13: 10: 01.483: ОШИБКА /Null (6189): at com.ciam.app.CiamInfoActivity.access $ 0 (CiamInfoActivity.java:257)

07-28 13: 10: 01.483: ОШИБКА /Null (6189): at com.ciam.app.CiamInfoActivity $ 2.run(CiamInfoActivity.java:123) 07-28 13: 10: 01.483: ОШИБКА /Null (6189): в java.lang.Thread.run(Thread.java:1020)

Я подозреваю, что есть некоторые различия между тем, как XML обрабатывается на Android 2 и Android 3. Любые идеи? Заранее спасибо.

  • 0
    Не Log.d() блок catch с помощью Log.d() . Используйте Log.e(LOG_TAG, "my message", e) . Чем вы увидите трассировку стека, которая покажет вам, какая строка его выдает ...
  • 0
    Благодарю. Реализовал это.
Теги:
multithreading
android-3.0-honeycomb

3 ответа

0
Лучший ответ

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

Если вы хотите быть уверены, что получите "nowplaying", вам нужно сделать "dom.getElementsByTagName(" nowplaying ")".

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

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
    = D Я собираюсь попробовать это.
  • 0
    благодарю вас. оно работает.
0

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

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

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

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

0

Я не совсем уверен, но мне может понадобиться сделать что-то со ссылкой, поскольку он может установить соединение, но не может найти файл... Попробуйте выполнить регистрацию, если он найдет xml, на который указывает url.

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

  • 0
    Удаление расширения xml: никакого эффекта.
  • 0
    Кроме того, это не главная проблема, просто часть кода не работает на 3.0. Если бы он был нулевым где-то с самого начала, он бы уже бросил NPE намного раньше.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню