2011-07-30 13 views
1

私はいつもXML文書の改行と空白が無視されたと考えましたか?それは誤解ですか、私のコードには何か不足していますか?改行がファイルに含まれているとXML解析が失敗しますか?

私のサーバーから取得したXML文書を解析しています。これは、すべてのコンテンツが1行にあるときにはうまく動作しますが、XML文書がインデントされているときには失敗します。

マイコード:XMLファイルは

<?xml version="1.0" encoding="UTF-8"?> 
<kml xmlns="http://earth.google.com/kml/2.0"><Document> 
<GeometryCollection><LineString><coordinates>These are the coordinates</coordinates></LineString></GeometryCollection> 
</Document></kml> 

である。しかし、ファイルがあるときに失敗し

public class JsonTestActivity extends ListActivity { 
    /** Called when the activity is first created. */ 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     //setContentView(R.layout.main); 

     Log.d("xxx", "on create started"); 
     try { 
      URL url = new URL("http://www.morefast.be/gethistory.php"); 

      HttpURLConnection urlConnection=(HttpURLConnection) url.openConnection(); 
      urlConnection.setRequestMethod("GET"); 
      urlConnection.setDoOutput(true); 
      urlConnection.setDoInput(true); 
      urlConnection.connect(); 

      DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
      DocumentBuilder db = dbf.newDocumentBuilder(); 
      Document doc = db.parse(urlConnection.getInputStream());   

      String path = doc.getElementsByTagName("GeometryCollection").item(0).getFirstChild().getFirstChild().getFirstChild().getNodeValue() ; 

      Log.d("xxx", "path is "+path); 

     } 
     catch (Exception e) { 
      Log.d("xxx", e.getMessage()); 

     } 



    } 



} 

作品罰金(例えば)

<?xml version="1.0" encoding="UTF-8"?> 
<kml xmlns="http://earth.google.com/kml/2.0"><Document> 
<GeometryCollection> 
<LineString><coordinates>These are the coordinates</coordinates></LineString></GeometryCollection> 
</Document></kml> 

私はそれらのファイルに変更すべて"GeometryCollection"の後に余分な改行を追加しています

LogCatが

07-30 20:44:48.364: ERROR/AndroidRuntime(545): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.mydomain.jsontest/com.mydomain.jsontest.JsonTestActivity}: java.lang.NullPointerException: println needs a message 
07-30 20:44:48.364: ERROR/AndroidRuntime(545):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663) 
07-30 20:44:48.364: ERROR/AndroidRuntime(545):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679) 
07-30 20:44:48.364: ERROR/AndroidRuntime(545):  at android.app.ActivityThread.access$2300(ActivityThread.java:125) 
07-30 20:44:48.364: ERROR/AndroidRuntime(545):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033) 
07-30 20:44:48.364: ERROR/AndroidRuntime(545):  at android.os.Handler.dispatchMessage(Handler.java:99) 
07-30 20:44:48.364: ERROR/AndroidRuntime(545):  at android.os.Looper.loop(Looper.java:123) 
07-30 20:44:48.364: ERROR/AndroidRuntime(545):  at android.app.ActivityThread.main(ActivityThread.java:4627) 
07-30 20:44:48.364: ERROR/AndroidRuntime(545):  at java.lang.reflect.Method.invokeNative(Native Method) 
07-30 20:44:48.364: ERROR/AndroidRuntime(545):  at java.lang.reflect.Method.invoke(Method.java:521) 
07-30 20:44:48.364: ERROR/AndroidRuntime(545):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
07-30 20:44:48.364: ERROR/AndroidRuntime(545):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
07-30 20:44:48.364: ERROR/AndroidRuntime(545):  at dalvik.system.NativeStart.main(Native Method) 
07-30 20:44:48.364: ERROR/AndroidRuntime(545): Caused by: java.lang.NullPointerException: println needs a message 
07-30 20:44:48.364: ERROR/AndroidRuntime(545):  at android.util.Log.println_native(Native Method) 
07-30 20:44:48.364: ERROR/AndroidRuntime(545):  at android.util.Log.d(Log.java:122) 
07-30 20:44:48.364: ERROR/AndroidRuntime(545):  at com.mydomain.jsontest.JsonTestActivity.onCreate(JsonTestActivity.java:43) 
07-30 20:44:48.364: ERROR/AndroidRuntime(545):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
07-30 20:44:48.364: ERROR/AndroidRuntime(545):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627) 
07-30 20:44:48.364: ERROR/AndroidRuntime(545):  ... 11 more 

を示しては、予想されるということですか?私はXML文書が空白を無視したと思っていましたか?

答えて

1

免責事項:私は(これらの日、あるいはJavaの)アンドロイドをしないプログラミングが、しかし... XML


ホワイトスペースは、一般的に、パーサーによってを無視されていません。むしろのテキストノード(内容として空白を含む)に変わります。正確な詳細は、XMLパーサーとオプション に依存します。

getFirstChild()は何を変更していますか?つまり、GeometryCollectionの最初の子はのテキストノードで、LineStringではありませんか? (そして、テキストノードの最初の子である... Larry Kaplan作私は、トレースにこれをフィットすることはできません、が:?!。java.lang.NullPointerException: println needs a message ...そこに座って奇妙に思える)

私がお勧めしますこれが実際のケースであれば、より良いセレクタから始めて手動のステップを避けてください。

ハッピーコーディング。

+0

'path'文字列がnullの場合、' printlnはメッセージを必要とします 'は' Log.d( "xxx"、 "path is" + path);に関係します。それが理にかなっているかどうかを確認するために投稿した回答を見てください。 – Squonk

+0

@MisterSquonkしかし '' str "+ null''は有効で' 'str" 'になります。そのため、私はその例外に疑問を持っています。しかし、はい、あなたの答えは私の仮説に同意します;-) –

+0

@MisterSquonkまあ、ほとんど同意します。私は、テキストノードがどのように子ノードを持つことができるか分かりません... –

1

空白を無視する必要があります。 しかし、getFirstChild()を3回呼び出し、<GeometryCollection>は深さがわずか2児です。

+0

Mircea:Erm - 改行がないときに動作します... – user410932

+0

@pstが正しいかもしれません。 'getFirstChild()'を一度呼び出すだけで、値をログに記録したり、次の呼び出しが 'null'を返すかどうかを調べることでチェックできます。 –

1

pstが正しいと思います(私は思う)。

getFirstChild()は「ノード」を返します。 DOMでは、 'Node'は要素、属性、(内部)テキストなどになります。

私は、改行がテキストノードとして扱われていると思います。最終的にはgetFirstChild()<coordinates>要素。要素ノードでgetNodeValue()を使用すると、null

関連する問題