У меня есть код, написанный для 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. Любые идеи? Заранее спасибо.
В вашем коде есть небольшая ошибка. Я действительно не понимаю, почему он работал с 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());
У меня такая же проблема и наткнулся на эту страницу. В моем наблюдении поведение getElementsByTagName отличается от разных версий Android.
В ver 2 результат влечет за собой, если у него есть указанный тег. В вашем случае, я думаю, переменная "docEle" имеет тег "nowplaying", поэтому он отлично работает.
В ver 3 результат только ищет от потомков, поэтому он не включает себя (docEle). Так что "nl" действительно пуст.
Согласно спецификации, версия 3, по-видимому, является ожидаемым поведением. Это кажется настолько важным, но никто не упомянул об этом. Или, может быть, я ошибаюсь...
Я не совсем уверен, но мне может понадобиться сделать что-то со ссылкой, поскольку он может установить соединение, но не может найти файл... Попробуйте выполнить регистрацию, если он найдет xml, на который указывает url.
Если он не может найти файл, попробуйте удалить расширение.xml, возможно, оно работает.
Log.d()
блок catch с помощьюLog.d()
. ИспользуйтеLog.e(LOG_TAG, "my message", e)
. Чем вы увидите трассировку стека, которая покажет вам, какая строка его выдает ...