Android SAXParseException:文档意外结束

Posted

技术标签:

【中文标题】Android SAXParseException:文档意外结束【英文标题】:Android SAXParseException: Unexpected end of document 【发布时间】:2013-12-20 13:48:45 【问题描述】:

我在解析 XML 时遇到此异常,但并非总是如此。错误后当我立即重试时,它可以工作。但是为什么我会遇到这个错误? 这也是我的代码和错误。

        StringEntity entity = new StringEntity(author, "UTF-8");        
        DefaultHttpClient httpClient = new DefaultHttpClient();
        SharedPreferences logIn = context.getSharedPreferences("Data", Context.MODE_PRIVATE);
        HttpPost httppost = new HttpPost(logIn.getString("Url", ""));
        httppost.setEntity(entity);  
        httppost.addHeader("Accept", "text/xml");               
        httppost.addHeader("Content-Type", "text/xml");
        HttpResponse response = httpClient.execute(httppost);                           
        HttpEntity r_entity = response.getEntity();
        xmlRecords  = EntityUtils.toString(r_entity);
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();
        InputSource is = new InputSource();
        is.setCharacterStream(new StringReader(xmlRecords));
        Document doc = db.parse(is);
            NodeList workItemsNode = doc.getElementsByTagName("Items");
         for (int i = 0; i < workItemsNode.getLength(); i++) 

                 //Some Code here

             

例外

org.xml.sax.SAXParseException:文档意外结束 在 org.apache.harmony.xml.parsers.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:125) 在 com.mobile.syrinx.services.SynchroniseWorkItemsService.FillLists(SynchroniseWorkItemsService.java:101) 在 com.mobile.syrinx.services.SynchroniseWorkItemsService.doInBackground(SynchroniseWorkItemsService.java:65) 在 com.mobile.syrinx.services.SynchroniseWorkItemsService.doInBackground(SynchroniseWorkItemsService.java:1) 在 android.os.AsyncTask$2.call(AsyncTask.java:252) 在 java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 在 java.util.concurrent.FutureTask.run(FutureTask.java:137) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1081) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:574) 在 java.lang.Thread.run(Thread.java:1020)

【问题讨论】:

【参考方案1】:

1) 确认您收到的 XML 有效。如果您正在使用从 Web 服务提供给您的 XML,那么谁知道您会得到什么。无效的 XML 可能会导致许多此类解析器出现问题。有时只会发生这种情况的事实让我认为这很可能是罪魁祸首。

DocumentBuilder 文档在这里:

http://docs.oracle.com/javase/7/docs/api/javax/xml/parsers/DocumentBuilder.html#parse(org.xml.sax.InputSource)

您可以看到,当解析 xml 出错时,会抛出 SAX 异常,这意味着 xml 在某种程度上是无效的。异常应该被捕获并相应处理。

2) 您正在解析的文件是否源自与您正在处理的操作系统不同的操作系统?这在过去给我带来了问题,Windows 文件导致 linux 系统上的解析器出错。我认为这不应该是这里的问题,但有可能。

【讨论】:

以上是关于Android SAXParseException:文档意外结束的主要内容,如果未能解决你的问题,请参考以下文章

安卓中的 SAXParseException

如何解决 Jenkins 中的 SAXParseException?

SAXParseException:找不到元素“定义”的声明

SAXParseException:找不到元素“定义”的声明

org.xml.sax.SAXParseException:prolog 中不允许内容

使用 mysql 进行休眠配置会出现错误 - SAXParseException