android应用中使用xmlpull解析xml文档失败

本人刚入门android

在看黎活明老师的android视频做一资讯客户端案例,使用android应用从web应用程序中获取xml数据再进解析成资讯实体,基本上按照视频上的操作可是我的应用就是失败了。

下面是我的业务代码

public class VideoNewsService {
	
	/**
	 * 获取最新视频资讯
	 * @return
	 * @throws IOException
	 * @throws XmlPullParserException 
	 */
	public  static  List<News>  getLastNews() throws IOException, XmlPullParserException {
		String  path = "http://10.0.2.2:8080/news/ListServlet";
		URL  url = new  URL(path);
		HttpURLConnection  conn = (HttpURLConnection) url.openConnection();
		conn.setReadTimeout(5000);
		conn.setRequestMethod("GET");
		if(conn.getResponseCode()==200) {
			InputStream  is = conn.getInputStream();
			return  parseXML(is);
		}
		return  null;
	}

	/**
	 * 解析服务器返回的XML数据
	 * @return
	 * @throws XmlPullParserException 
	 * @throws IOException 
	 */
	private    List<News> parseXML(InputStream  is) throws XmlPullParserException, IOException {
		List<News>  newsList = new  ArrayList<News>();
		XmlPullParser  parser = Xml.newPullParser();
		parser.setInput(is, "UTF-8");
		int  type = parser.getEventType();
		News  news = null;
		while(type!=XmlPullParser.END_DOCUMENT) {
			switch (type) {
			case XmlPullParser.START_TAG:
				if("news".equals(parser.getName())) {
					news = new News();
					Integer  id = Integer.valueOf(parser.getAttributeValue(0));
					news.setId(id);
				}  else  if("name".equals(parser.getName())) {
					String  name = parser.nextText();
					news.setName(name);
				}  else  if("timeLength".equals(parser.getName())) {
					Integer  timeLength = Integer.valueOf(parser.nextText());
					news.setTimeLength(timeLength);
				}
				break;
			case  XmlPullParser.END_TAG:
				if("news".equals(parser.getName())) {
					newsList.add(news);
					news = null;
				}
				break;
			default:
				break;
			}
			type = parser.next();
		}
		return  newsList;
	}
}


        运行的时候解析失败,一开始以为是我的解析代码写错了,经仔细核对并无误,看LogCat打印出的错误信息也没看出什么端倪,只知道是解析XML数据出错了,但为了进一步确认还是做了一实验,用从web应用返回的XML数据构建了一字符串用Log进行记录,从LogCat中看到了正确的数据,这次确信无疑是XML解析出了问题。

       于是去检验parseXML方法,自己写了一XML文件用该方法进行单元测试,竟然解析成功了,这我就纳闷了,为什么从web应用返回的XMl数据无误,解析方法也没问题,两个一组在一起就出问题了呢,后来再回增看打印出的错误信息,其中有一句:XML or text declaration not at start of entity,这使我想到XML文件的文档声明,由于要引入JSTL所以我的文档声明没有放在第一行,后来把文档声明放到第一行再运行android应用,运行成功了,这下终于搞明白了,对于xmlpull解析器文档声明一定要放在第一行的位置,否则解析就会出错。

 

你可能感兴趣的:(android应用中使用xmlpull解析xml文档失败)