org.xmlpull.v1.XmlPullParserException: Error parsing document. (position:line -1, column -1) 解決方案

org.xmlpull.v1.XmlPullParserException: Error parsing document. (position:line -1, column -1) caused by: org.apache.harmony.xml.ExpatParser$ParseException: At line 5, column 10: not well-formed (invalid token)
at org.apache.harmony.xml.ExpatPullParser$ByteDocument.flush(ExpatPullParser.java:959)
at org.apache.harmony.xml.ExpatPullParser$Document.pump(ExpatPullParser.java:770)
at org.apache.harmony.xml.ExpatPullParser$Document.dequeue(ExpatPullParser.java:814)
at org.apache.harmony.xml.ExpatPullParser.next(ExpatPullParser.java:303)
at cn.kafei.service.IdentityCardService.parseCardXml(IdentityCardService.java:85)
at cn.kafei.service.IdentityCardService.getCard(IdentityCardService.java:36)
at cn.kafei.test.XmlTest.testSendXML(XmlTest.java:34)
at java.lang.reflect.Method.invokeNative(Native Method)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:169)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:154)
at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:520)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1447)

造成原因分析:

一般來說,自己寫的XML文件都是以UTF-8進行編碼的,但是在有些網絡上的XML使用的編碼方式是GBK或者其他編碼,而在XmlPullParser進行解析時,我嘗試使用過GBK,但是還是報上面的錯誤,糾結了我好幾個小時,最後終於找到解決方案,將GBK文件讀到緩衝區,然後再以輸入流的形式進行轉換,最後在調用XmlPullParser的setInput方法時,將編碼設置爲UTF-8就可以了。

下面是完整的代碼,已將這個解決辦法封裝爲通用方法,直接調用即可。

/**
	 * 讀取GBK XML文件
	 * @param inputStream
	 * @return
	 * @throws Exception
	 */
	public static ByteArrayInputStream readGBKXml(InputStream inputStream)
			throws Exception {
		// 獲取返回的XML數據,因爲服務器返回的是一個GBK編碼的XML數據,所以這裏以GBK編碼來接收
		InputStreamReader reader = new InputStreamReader(inputStream, "gbk");
		BufferedReader br = new BufferedReader(reader);// 將InputStreamReader讀到緩衝區中
		String temp;
		String result = "";
		while ((temp = br.readLine()) != null) {
			result = result + temp;
		}
		ByteArrayInputStream stream = new ByteArrayInputStream(
				result.getBytes());
		return stream;
	}
示例:

XmlPullParser pullParser = Xml.newPullParser();
		pullParser.setInput(readGBKXml(inputStream), "UTF-8");
//解析XML過程代碼省略...


歡迎大家提出更多的解決方案,以便進行學習討論。

轉載請註明出處:


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章