我正在尝试从开放天气应用程序解析数据文档。我在整个文件中成功阅读。我可以把整个文件放到文本视图中。我只需要解析那些数据。我尝试解析时遇到此错误:
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();
}
}
我做了一个快速谷歌搜索,其他有这个错误的人在他将文件存储在计算机/手机上时出现此错误。
答案 0 :(得分:0)
这是因为您在尝试解析xml时已经到达InputStream
的末尾。
实际上,当使用InputStreamReader
显示流内容时,您移动文件"光标"直到流的结尾。
因此,当您尝试使用SAX解析器解析它时,它会引发文档Exception的结尾(如果您将解析代码替换为对data.read()的调用,它将返回-1,这意味着您已经到达流的末尾)。
如果删除InputStreamReader
相关代码,则可以解析xml。
如果您想保留此代码,因为reset
不支持HttpInputStream
方法(允许将光标重置到文件的开头),您应该将其内容复制到{例如{1}}或StringBuilder
。