谷歌发布说去除了HttpClient方法今天用HTTPUrlConnection写了个解析xml文件的
程序然后出错了求各位大神们帮忙
这是我的代码
private void init() {
listView= (ListView) findViewById(R.id.list_text);
new Thread(new Runnable() {
@Override
public void run() {
getNewsInternet();
}
}).start();
}
//返回新闻信息
private List getNewsInternet(){
// //url:http://10.0.2.2:8080/NetEaseServer/new.xml
try {
URL url =new URL("http://10.0.2.2:8080/NetEaseServer/new.xml");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(1000);
conn.setReadTimeout(500);
conn.connect();
int responseCode = conn.getResponseCode();
if(responseCode==200){
InputStream is = conn.getInputStream();
List listXml =getXML(is);
Log.i(TAG,listXml.get(0).toString());
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
private List<NewInfo> getXML(InputStream is) throws XmlPullParserException, IOException {
XmlPullParser paser = Xml.newPullParser();//xml pull解析器
paser.setInput(is,"UTF-8");//设置流格式
int evenType = paser.getEventType();
Log.i(TAG,"文件的事件"+evenType);
List<NewInfo> newInfoList=null;
NewInfo newInfo= null;
while (evenType!=XmlPullParser.END_DOCUMENT){//如果没到结束就一直循环
String tagName=paser.getName();//获得节点名称
Log.i(TAG,"节点名称"+tagName);
switch (evenType){
case XmlPullParser.START_TAG: //<news>
if("news".equals(tagName)){
newInfoList= new ArrayList<NewInfo>() ;
}else if("new".equals(tagName)){
newInfo = new NewInfo();
}else if("title".equals(tagName)){
newInfo.setTitle(paser.nextText());//讲title的内容放进newinfo对象中
Log.i(TAG,"文件的标题"+paser.nextText());
}else if("detail".equals(tagName)){
newInfo.setDetail(paser.nextText());//讲detaile的内容放进去
}else if("comment".equals(tagName)){
newInfo.setComment(Integer.parseInt(paser.nextText()));//《commet》
}else if("image".equals(tagName)){
newInfo.setImageUrl(paser.nextText());//《图片》
}
break;
case XmlPullParser.END_TAG:
if("news".equals(tagName)){
newInfoList.add(newInfo);
}
break;
default:
break;
}
evenType=paser.next();//取下一个时间的类型
}
return newInfoList;
}
Logcat的信息
-12865/? I/MainActivity﹕ 文件的事件0
10-17 12:56:10.387 12852-12865/? I/MainActivity﹕ 节点名称null
10-17 12:56:10.427 12852-12865/? I/MainActivity﹕ 节点名称news
10-17 12:56:10.457 12852-12865/? I/MainActivity﹕ 节点名称null
10-17 12:56:10.467 12852-12865/? I/MainActivity﹕ 节点名称new
10-17 12:56:10.497 12852-12865/? I/MainActivity﹕ 节点名称null
10-17 12:56:10.497 12852-12865/? I/MainActivity﹕ 节点名称title
10-17 12:56:10.577 12852-12865/? W/System.err﹕ org.xmlpull.v1.XmlPullParserException: precondition: START_TAG (position:END_TAG @4:34 in java.io.InputStreamReader@4173a850)
10-17 12:56:10.607 12852-12865/? W/System.err﹕ at org.kxml2.io.KXmlParser.nextText(KXmlParser.java:2053)
10-17 12:56:10.637 12852-12865/? W/System.err﹕ at activity.cn.com.wangyinews3.MainActivity.getXML(MainActivity.java:100)
10-17 12:56:10.637 12852-12865/? W/System.err﹕ at activity.cn.com.wangyinews3.MainActivity.getNewsInternet(MainActivity.java:58)
10-17 12:56:10.668 12852-12865/? W/System.err﹕ at activity.cn.com.wangyinews3.MainActivity.access$000(MainActivity.java:26)
10-17 12:56:10.668 12852-12865/? W/System.err﹕ at activity.cn.com.wangyinews3.MainActivity$1.run(MainActivity.java:41)
10-17 12:56:10.697 12852-12865/? W/System.err﹕ at java.lang.Thread.run(Thread.java:841)
为何会这样的 该怎么解决呢?
求帮顶 求解决 新人没悬赏
貌似你解析时解析到的内容是空的,你那个news对象都没实例化,你的列表集合newInfoList= new ArrayList() 这样写,然后你应该在解析前生成一个NewInfo对象,在解析的时候实例化,可以参考我这个代码,请仔细阅读,看看你的问题出现在哪里:
package com.android.service;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import org.xmlpull.v1.XmlPullParser;
import android.util.Xml;
import com.android.domain.News;
public class VideoNewsService {
/**
* 获取最新的视频资讯
*
* @return
* @throws Exception
*/
public static List<News> getLastNews() throws
Exception {
String path =
"http://10.100.18.229:8083/Videonews//servlet/ListServ
let";
URL url = new URL(path);
HttpURLConnection connection =
(HttpURLConnection) url.openConnection();
connection.setConnectTimeout(5000);
connection.setRequestMethod("GET");
if (connection.getResponseCode() ==
200) {
InputStream inputStream =
connection.getInputStream();
return parseXML(inputStream);
}
return null;
}
/**
* 解析服务器返回的xml数据
*
* @param inputStream
* @return
*/
private static List<News> parseXML(InputStream
inputStream) throws Exception {
List<News> list=new ArrayList<News>();
News news = null;
XmlPullParser parser =
Xml.newPullParser();// 实例化一个XmlPullParser对象
parser.setInput(inputStream, "utf-
8");// 设置要解析的数据
int event = parser.getEventType();//
获得开始文档事件
while (event !=
XmlPullParser.END_DOCUMENT) {// 只要事件不等于文档的结
束事件
switch (event) {
case XmlPullParser.START_TAG:
if ("news".equals
(parser.getName())) {
int id = new
Integer(parser.getAttributeValue(0));
news = new
News();
news.setId
(id);
} else if
("title".equals(parser.getName())) {
news.setTitle
(parser.nextText());
} else if
("timelength".equals(parser.getName())) {
news.setTimelength(new Integer(parser.nextText()));
}
break;
case XmlPullParser.END_TAG:
if ("news".equals
(parser.getName())) {
list.add
(news);
news=null;
}
default:
break;
}
event = parser.next();// 获得下个节点
}
return list;
}
}
不好意思,我看错了,你试下这样行不行,有可能是你后面结束那个节点没解析到,如下图所示:
你这个要做好节点的判断就行了吧!
你的xml文件中有几个news节点呢?看你的代码,如果有多个news的话,会在每个news开始节点处执行newInfoList= new ArrayList() ;那么最后只会返回最后一个news节点的信息。
正确初始化位置应该在文档开始时初始化。看你的代码基本没啥问题,跟参考链接中代码几乎一样,其实就是一很简单的XmlPUllParse的应用,对比检查下再调试看看吧。
参考:http://blog.csdn.net/caesardadi/article/details/8626097