试图从Web服务.SAXParseException解析xml数据

时间:2016-09-11 22:34:35

标签: android xml parsing android-studio xml-parsing

我正在尝试从开放天气应用程序解析数据文档。我在整个文件中成功阅读。我可以把整个文件放到文本视图中。我只需要解析那些数据。我尝试解析时遇到此错误:

org.xml.sax.SAXParseException:文档的意外结束

这是我的解析和阅读文档的代码。

public void Weather(View view){
    InputStream data;
    final String OPEN_WEATHER_MAP_API =
            "http://api.openweathermap.org/data/2.5/weather?q=";

    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
    StrictMode.setThreadPolicy(policy);
    try {
        URL url = new URL(String.format(OPEN_WEATHER_MAP_API + City + "&mode=xml&appid=40f9dad632ecd4d87b55cb512d538b75"));
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();

        // connection.addRequestProperty("x-api-key", this.getString(R.string.open_weather_maps_app_id));

        data = connection.getInputStream();

        InputStreamReader inputStreamReader = new InputStreamReader(data);
        BufferedReader Reader = new BufferedReader(inputStreamReader);


        StringBuffer Weatherdata = new StringBuffer();
        String storage;
        while ((storage = Reader.readLine()) != null) {
            Weatherdata.append(storage + "\n");

        }
        cityField.setText(Weatherdata.toString());
    }
    catch(Exception e){
        e.printStackTrace();
        cityField.setText("Fail");
        return;
    }
    try {
        DocumentBuilderFactory documetBuilderFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder documentBuilder = documetBuilderFactory.newDocumentBuilder();
        Document xmlDocument = documentBuilder.parse(data);
        Element rootElement = xmlDocument.getDocumentElement();
    }
    catch (Exception e){
        e.printStackTrace();
    }

}

我做了一个快速谷歌搜索,其他有这个错误的人在他将文件存储在计算机/手机上时出现此错误。

1 个答案:

答案 0 :(得分:0)

这是因为您在尝试解析xml时已经到达InputStream的末尾。 实际上,当使用InputStreamReader显示流内容时,您移动文件"光标"直到流的结尾。

因此,当您尝试使用SAX解析器解析它时,它会引发文档Exception的结尾(如果您将解析代码替换为对data.read()的调用,它将返回-1,这意味着您已经到达流的末尾)。

如果删除InputStreamReader相关代码,则可以解析xml。

如果您想保留此代码,因为reset不支持HttpInputStream方法(允许将光标重置到文件的开头),您应该将其内容复制到{例如{1}}或StringBuilder