2011-07-28 81 views
1

我有爲Android 2.2編寫的代碼,應該將xml從網頁解析爲字符串。它在Android 2.2模擬器上工作正常,但它在我的Android 3.1平板電腦上給了我一個NullPointerException。下面是代碼:Android 3.1 Xml解析NullPointerException

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 =(Element)entry.getElementsByTagName(「artist」)。item(0);

編輯2

07-28 13:10:01.483:ERROR /空(6189):我的消息

07-28 13:10:01.483:ERROR /空(6189):JAVA。 lang.NullPointerException

07-28 13:10:01.483:ERROR /空(6189):在com.ciam.app.CiamInfoActivity.refreshMeta(CiamInfoActivity.java:280)

07-28 13:10 :01.483:錯誤/空(6189):at com.ciam.app.CiamInfoActivity.access $ 0(CiamInfoActivity.java:257)

07:28:13:10:01.483:ERROR/Null(6189):at com.ciam.app.CiamInfoActivity $ 2.run(CiamInfoActivity.java:123) 07-28 13:10:01.483:ERROR/Null (6189):在java.lang.Thread.run(Thread.java:1020)

我懷疑在android 2和android 3上解析xml的方式有一些區別。任何想法?提前致謝。

+0

不要使用'Log.d()'登錄catch塊。使用Log.e(LOG_TAG,「我的消息」,e)'。比你會看到一個堆棧跟蹤,它顯示你哪一行... – WarrenFaith

+0

謝謝。實施它。 – gammaraptor

回答

0

代碼中存在一個小錯誤。我真的不明白爲什麼它使用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我會嘗試一下。 – gammaraptor

+0

謝謝。有用。 – gammaraptor

0

我不完全確定,但它可能必須做一些與鏈接,因爲它可以使連接,但無法找到該文件...嘗試日誌記錄,如果它可以找到xml的url點至。

如果找不到該文件,請嘗試刪除.xml擴展名,也許它可以工作。

+0

刪除xml擴展名:無效。 – gammaraptor

+0

此外,這不是主要問題,它只是一些代碼不適用於3.0。如果它在某個地方是空的,那麼它早就已經拋出NPE了。 – gammaraptor

+0

真的,嗯,我已經在平板電腦上使用了一個domparser,並在資產中使用了本地xml文件,它的工作原理與我一樣...所以我不確定那時會出現什麼問題。 – Androider

0

我有類似的問題,偶然發現了這個頁面。 在我看來,getElementsByTagName的行爲在不同的android版本中是不同的。

在版本2中,如果它具有指定的標籤,則結果本身包含其自身。在你的情況下,我猜變量「docEle」有標籤「nowplaying」,所以它工作正常。

在版本3中,結果僅從後代搜索,因此它不包含自身(docEle)。所以「nl」真的是空虛的。

根據規範,版本3似乎是預期的行爲。 這似乎很重要,但沒有人提到過這一點。或者,我可能是錯的...