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過程代碼省略...
歡迎大家提出更多的解決方案,以便進行學習討論。
轉載請註明出處: