本人刚入门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解析器文档声明一定要放在第一行的位置,否则解析就会出错。