2011-07-30 5 views
1

나는 항상 XML 문서의 줄 바꿈과 공백이 무시되었다고 생각 했습니까? 그것이 오해입니까, 아니면 제 코드에 부족한 부분이 있습니까?파일에 개행이있을 때 XML 구문 분석이 실패합니까?

다음과 같은 현상이 발생합니다. 서버에서 검색 한 XML 문서를 구문 분석하고 있습니다. 이 작업은 모든 내용이 한 줄에 있지만 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"뒤에 추가 개행을 추가했습니다.

로그 캡쳐보기

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

면책 조항 : 나는


이 공간 화이트 XML 에서 일반적으로 파서을 무시하지 않습니다 ...하지만, 프로그램을 안드로이드 (또는 자바 요즘)하지 않습니다. 오히려 텍스트 노드 (내용으로 공백 포함)으로 바뀝니다. 정확한 세부 정보는 XML 구문 분석기와 옵션에 따라 다릅니다.

getFirstChild()은 무엇을 변경하고 있습니까? 즉, GeometryCollection의 첫 번째 자식은 이고 LineString이 아닌 텍스트 노드입니까? (그리고 텍스트 노드의 첫 번째 자식은 ... 터져 죽자 내가 추적에이 맞지 않을 수 있지만 :?!. java.lang.NullPointerException: println needs a message ... 거기에 앉아 이상한 것 같다)

내가 제안 이것이 사실이라면 더 나은 선택기로 시작하여 수동 스텝핑을 피하십시오.

해피 코딩.

+0

'println은 메시지가 필요합니다'는'path' 문자열이 null 일 때'Log.d ("xxx", "path is"+ path);와 관련이 있습니다. 그것이 의미가 있는지보기 위해 올린 답변을보십시오. – Squonk

+0

@MisterSquonk하지만 str "+ null"은 유효하고''str "'이됩니다. 그래서 나는 그 특별한 예외에 대해 질문합니다. 하지만 예, 당신의 대답은 제 가설과 일치합니다 ;-) –

+0

@MisterSquonk 글쎄, 대부분 동의합니다. 텍스트 노드가 자식 노드를 가질 수있는 방법을 잘 모르겠습니다 ... –

1

공백을 무시해야합니다. 그러나 getFirstChild() 번을 세 번 호출하면 <GeometryCollection>이 두 번 밖에 안됩니다.

+0

Mircea : Erm - 개행 문자가 없을 때 작동합니다. – user410932

+0

@pst가 맞을 수도 있습니다. 'getFirstChild()'를 한 번만 호출하고 값을 로깅하거나 다음 번 호출이'null'을 반환하는지 확인하여 확인할 수 있습니다. –

1

pst가 정확합니다 (제 생각).

getFirstChild()은 '노드'를 반환합니다. DOM에서 'Node'는 요소, 속성 또는 (내부) 텍스트 등이 될 수 있습니다.

줄 바꾸기가 텍스트 노드로 처리되는 것 같습니다. 즉 getFirstChild()<coordinates> 요소에 착륙했습니다. . 요소 노드에서 getNodeValue()을 사용하면 null

관련 문제