2011-12-08 17 views
3

XMLファイルを解析しようとしています。このファイルは次のとおりです。これはコードですAndroid Node.getNodeValueは場合によってはNULLを返します

<root> 
     <entry> 
       <username>achanda</username> 
       <latitude>45.123</latitude> 
       <longtitude>76.345</longtitude> 
       <timestamp>2000</timestamp> 
       <filename>image2.jpg</filename> 
     </entry> 
     <entry> 
       <username>achanda</username> 
       <latitude>45.123</latitude> 
       <longtitude>76.345</longtitude> 
       <timestamp>2000</timestamp> 
       <filename>image2.jpg</filename> 
     </entry> 
     <entry> 
       <username>achanda</username> 
       <latitude>45.123</latitude> 
       <longtitude>76.345</longtitude> 
       <timestamp>2000</timestamp> 
       <filename>image2.jpg</filename> 
     </entry> 
</root> 

private String getTextValue(Element ele, String tagName) { 
     String textVal = ""; 
     NodeList nl = ele.getElementsByTagName(tagName); 
     if (nl != null && nl.getLength() > 0) { 
      Element el = (Element) nl.item(0); 
      Node n = el.getFirstChild(); 
      //TODO this line throws an exception for the last 
      //entry in the xml file. Fix this 
      textVal = n.getNodeValue(); 
     } 
     return textVal; 
    } 

これは最初の2個の<entry>のタグが、getNodeValue()戻って最後のタグのためのnull用のファイルを解析します。いくつかの条件でnullを返すと思われるhereが見つかりました。どのようにフィールドを抽出するのですか?私はel.getFirstChild()をにキャストしようとしましたが、うまくいきませんでした。

private float getFloatValue(Element ele, String tagName) { 
     return Float.parseFloat(getTextValue(ele, tagName)); 
    } 

    public ArrayList<GeoPoint> parseFile(String path) { 
     DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
     Document dom = null; 
     ArrayList<GeoPoint> gp = new ArrayList<GeoPoint>(); 
     try { 
      DocumentBuilder db = dbf.newDocumentBuilder(); 
      dom = db.parse(path); 

      org.w3c.dom.Element eroot = dom.getDocumentElement(); 
      NodeList nl = eroot.getElementsByTagName("entry"); 

      if (nl != null && nl.getLength() > 0) { 
       for (int i = 0; i < nl.getLength(); i++) { 
        org.w3c.dom.Element el = (org.w3c.dom.Element) nl.item(i); 
        float lat = (float) (getFloatValue(el, LAT) * 1E6); 
        float lon = (float) (getFloatValue(el, LON) * 1E6); 
        Log.e("###LAT: ", Float.toString(lat)); 
        Log.e("###LON: ", Float.toString(lon)); 
        //gp.add(new GeoPoint((int) lat, (int) lon)); 
       } 
      } 
     } catch (ParserConfigurationException pce) { 
      pce.printStackTrace(); 
     } catch (SAXException se) { 
      se.printStackTrace(); 
     } catch (IOException ioe) { 
      ioe.printStackTrace(); 
     } 
     return gp; 
    } 

Logcat出力:私はxmlファイルのすべての内容を削除して、もう一度それを書いた後、

12-08 01:05:38.718: D/AndroidRuntime(3148): Shutting down VM 
12-08 01:05:38.718: W/dalvikvm(3148): threadid=1: thread exiting with uncaught exception (group=0x40015560) 
12-08 01:05:38.779: E/AndroidRuntime(3148): FATAL EXCEPTION: main 
12-08 01:05:38.779: E/AndroidRuntime(3148): java.lang.IllegalStateException: Could not execute method of the activity 
12-08 01:05:38.779: E/AndroidRuntime(3148):  at android.view.View$1.onClick(View.java:2144) 
12-08 01:05:38.779: E/AndroidRuntime(3148):  at android.view.View.performClick(View.java:2485) 
12-08 01:05:38.779: E/AndroidRuntime(3148):  at android.view.View$PerformClick.run(View.java:9080) 
12-08 01:05:38.779: E/AndroidRuntime(3148):  at android.os.Handler.handleCallback(Handler.java:587) 
12-08 01:05:38.779: E/AndroidRuntime(3148):  at android.os.Handler.dispatchMessage(Handler.java:92) 
12-08 01:05:38.779: E/AndroidRuntime(3148):  at android.os.Looper.loop(Looper.java:130) 
12-08 01:05:38.779: E/AndroidRuntime(3148):  at android.app.ActivityThread.main(ActivityThread.java:3683) 
12-08 01:05:38.779: E/AndroidRuntime(3148):  at java.lang.reflect.Method.invokeNative(Native Method) 
12-08 01:05:38.779: E/AndroidRuntime(3148):  at java.lang.reflect.Method.invoke(Method.java:507) 
12-08 01:05:38.779: E/AndroidRuntime(3148):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
12-08 01:05:38.779: E/AndroidRuntime(3148):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
12-08 01:05:38.779: E/AndroidRuntime(3148):  at dalvik.system.NativeStart.main(Native Method) 
12-08 01:05:38.779: E/AndroidRuntime(3148): Caused by: java.lang.reflect.InvocationTargetException 
12-08 01:05:38.779: E/AndroidRuntime(3148):  at java.lang.reflect.Method.invokeNative(Native Method) 
12-08 01:05:38.779: E/AndroidRuntime(3148):  at java.lang.reflect.Method.invoke(Method.java:507) 
12-08 01:05:38.779: E/AndroidRuntime(3148):  at android.view.View$1.onClick(View.java:2139) 
12-08 01:05:38.779: E/AndroidRuntime(3148):  ... 11 more 
12-08 01:05:38.779: E/AndroidRuntime(3148): Caused by: java.lang.NullPointerException 
12-08 01:05:38.779: E/AndroidRuntime(3148):  at com.apps.terrapin.SearchActivity.getTextValue(SearchActivity.java:186) 
12-08 01:05:38.779: E/AndroidRuntime(3148):  at com.apps.terrapin.SearchActivity.getFloatValue(SearchActivity.java:192) 
12-08 01:05:38.779: E/AndroidRuntime(3148):  at com.apps.terrapin.SearchActivity.parseFile(SearchActivity.java:209) 
12-08 01:05:38.779: E/AndroidRuntime(3148):  at com.apps.terrapin.SearchActivity.searchData(SearchActivity.java:100) 
12-08 01:05:38.779: E/AndroidRuntime(3148):  at com.apps.terrapin.SearchActivity.searchClicked(SearchActivity.java:70) 
12-08 01:05:38.779: E/AndroidRuntime(3148):  ... 14 more 

更新 この問題は解決されました。 Androidがファイルを何とかキャッシュしていたようだ。ここで何が問題になったのでしょうか?

+0

ここにlogcatを入れることができますか? –

+0

logcat出力の投稿を更新しました –

+1

あなたのアップデートに関しては、XMLファイルを変更するたびに必ずクリーンアップを行ってください。それ以外の場合、SDKは現在生成されている値を保持します。 – Codeman

答えて

0

この問題は、xmlファイルのすべての内容を削除してもう一度書き留めた後に解決されました。 Androidがファイルを何とかキャッシュしていたようだ。

関連する問題