2012-05-04 25 views
0

我用JDOM與我的Android項目,每次我得到一個特定的字符在我的服務器響應時間,我結束了這些錯誤消息:JDOM投擲解析異常不良ASCII字符

05- 04 10:08:46.277:E/PARSE:org.jdom.input.JDOMParseException:文檔UTF-8的第95行上的錯誤:在行95,列5263:未關閉的令牌

05-04 10:08:46.277 :E /錯誤處理程序:處理程序失敗:org.jdom.input.JDOMParseException:第1行上的錯誤:在第1行,第0列:語法錯誤

當我通過谷歌瀏覽器進行相同的查詢時, l的XML通過很好,並且實際上沒有區域中的令牌未關閉。在整個應用程序開發過程中,我遇到過幾次這個問題,並且解決方案一直是刪除奇怪的ascii字符(複製/粘貼到這些數據字段中的版權徽標或商標字符等)。我怎樣才能讓它去掉那些字符,或者去掉它們並繼續這個功能。這是我的一個解析函數的例子。

public static boolean parseUserData(BufferedReader br) { 
    SAXBuilder builder = new SAXBuilder(); 
    Document document = null; 

    try { 
     document = builder.build(br); 

     /* XML Output to Logcat */ 
     if (document != null) { 
      XMLOutputter outputter = new XMLOutputter(
        Format.getPrettyFormat()); 
      String xmlString = outputter.outputString(document); 
      Log.e("XML", xmlString); 
     } 

     Element rootNode = document.getRootElement(); 
     if (!rootNode.getChildren().isEmpty()) { 

      // Do stuff 
      return true; 
     } 

    } catch (Exception e) { 
     GlobalsUtil.errorUtil 
       .setErrorMessage("Error Parsing XML: User Data"); 
     Log.e(DEBUG_TAG, e.toString()); 
     return false; 
    } 
} 
+0

您可以上傳一個例子響應這樣的地方我們可以看到它嗎?你也說一些特定的角色會導致問題,但哪些?他們在哪裏被使用? – Jules

+0

我無法上傳響應,因爲上面的代碼是我們實際代碼的調整版本(變量和方法名稱已更改)。我無法上傳誤差很大的XML響應,因爲它包含敏感的客戶信息。當我們的客戶複製/粘貼東西到(我們已經從他們的電子郵件中複製/粘貼它們,像「Powered By Motorola(tm)<--- ascii(tm)」這樣的東西將顯示並引起問題 – RyanInBinary

回答

1

它明顯聽起來像是一個字符編碼問題。我認爲duffymo在他的評估中是正確的。我有兩個意見,雖然......

如果您通過URL獲取您的數據,您應該使用URLConnection.getContentType()獲取字符集(如果它設置和字符集不爲空)設置在URL的InputStream上輸入InputStreamReader ...

您是否嘗試過JDOM 2.0.1?它是第一個在Android上經過全面測試的JDOM版本(以及Android上唯一支持的JDOM版本)。 JDOM 2.0.1還具有許多性能調整和內存優化,可以讓你的處理速度更快。它還修復了一些bug ....雖然從我看你不刊登任何錯誤問題.....

退房https://github.com/hunterhacker/jdom/wiki/JDOM2-Migration-Issueshttps://github.com/hunterhacker/jdom/wiki/JDOM2-and-Android

+0

我已更新爲jdom 2,它尚未解決任何問題,但可能會阻止我在將來發生錯誤,因此我非常欣賞那些信息。雖然我不確定URL的內容類型。我一直在使用HttpResponse,然後將getEntity()。getContent()傳遞到我的輸入流閱讀器中。這是一種糟糕的處理方式嗎? – RyanInBinary

+0

http://developer.android.com/reference/org/apache/http/HttpEntity.html#getContentType%28%29 <---你應該期待一個類似......的值......其實,只要看看這個響應就可以了:http://stackoverflow.com/questions/1381617/simplest-way-to-correctly-load-html-from-web-page-into-a-string-in-java – rolfl

1

BufferedReader構造爲接受編碼參數嗎?也許你需要告訴Reader或InputStream,你通過使用UTF-8。

+0

聽起來好像它可能是問題的一部分,我怎麼能在創建的BufferedReader中設置 – RyanInBinary

+0

我在javadocs中沒有看到這樣的參數,它必須設置在你用BufferedReader包裝的對象中。 – duffymo

+0

在我的查詢代碼(抓住/返回BufferedReader中,這是後來冒充,我設置的ISO模式,但不是UTF)。 的BufferedReader BR =新的BufferedReader(新的InputStreamReader( \t \t \t \t \t response.getEntity ().getContent(), 「ISO-8859-1」)); – RyanInBinary