Android 使用XMLPull解析器进行RSS链接解析
我正在开发一个完全基于RSS提要的应用程序,我想使用XML解析器解析RSS链接,我遵循了一些教程并使用XMLPull解析器实现了一个代码,但当我想解析这个链接时,我得到了正确的响应,但当我想解析这个链接时,解析器没有响应我。。我不知道为什么 我花了一周时间解决这个问题。。请帮帮我 这是我的密码 MainActivity.javaAndroid 使用XMLPull解析器进行RSS链接解析,android,xml,parsing,rss,xmlpullparser,Android,Xml,Parsing,Rss,Xmlpullparser,我正在开发一个完全基于RSS提要的应用程序,我想使用XML解析器解析RSS链接,我遵循了一些教程并使用XMLPull解析器实现了一个代码,但当我想解析这个链接时,我得到了正确的响应,但当我想解析这个链接时,解析器没有响应我。。我不知道为什么 我花了一周时间解决这个问题。。请帮帮我 这是我的密码 MainActivity.java package com.rajeshvijayakumar.xmlpullparser; import java.util.ArrayList; i
package com.rajeshvijayakumar.xmlpullparser;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
import com.rajeshvijayakumar.model.RSSFeed;
import com.rajeshvijayakumar.parser.NewsFeedParser;
public class MainActivity extends Activity implements OnItemClickListener {
private ListView mRssListView;
private NewsFeedParser mNewsFeeder;
private List<RSSFeed> mRssFeedList;
private RssAdapter mRssAdap;
private static final String TOPSTORIES ="http://www.pokerlistings.com/feed/blogs";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.rss_feed_view);
mRssListView = (ListView) findViewById(R.id.rss_list_view);
mRssFeedList = new ArrayList<RSSFeed>();
new DoRssFeedTask().execute(TOPSTORIES);
mRssListView.setOnItemClickListener(this);
}
private class RssAdapter extends ArrayAdapter<RSSFeed> {
private List<RSSFeed> rssFeedLst;
public RssAdapter(Context context, int textViewResourceId, List<RSSFeed> rssFeedLst) {
super(context, textViewResourceId, rssFeedLst);
this.rssFeedLst = rssFeedLst;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = convertView;
RssHolder rssHolder = null;
if (convertView == null) {
view = View.inflate(MainActivity.this, R.layout.rss_list_item, null);
rssHolder = new RssHolder();
rssHolder.rssTitleView = (TextView) view.findViewById(R.id.rss_title_view);
view.setTag(rssHolder);
} else {
rssHolder = (RssHolder) view.getTag();
}
RSSFeed rssFeed = rssFeedLst.get(position);
rssHolder.rssTitleView.setText(rssFeed.getTitle());
return view;
}
}
static class RssHolder {
public TextView rssTitleView;
}
public class DoRssFeedTask extends AsyncTask<String, Void, List<RSSFeed>> {
ProgressDialog prog;
String jsonStr = null;
Handler innerHandler;
@Override
protected void onPreExecute() {
prog = new ProgressDialog(MainActivity.this);
prog.setMessage("Loading....");
prog.show();
}
@Override
protected List<RSSFeed> doInBackground(String... params) {
for (String urlVal : params) {
mNewsFeeder = new NewsFeedParser(urlVal);
}
mRssFeedList = mNewsFeeder.parse();
return mRssFeedList;
}
@Override
protected void onPostExecute(List<RSSFeed> result) {
prog.dismiss();
runOnUiThread(new Runnable() {
@Override
public void run() {
mRssAdap = new RssAdapter(MainActivity.this, R.layout.rss_list_item,
mRssFeedList);
int count = mRssAdap.getCount();
if (count != 0 && mRssAdap != null) {
mRssListView.setAdapter(mRssAdap);
}
}
});
}
@Override
protected void onProgressUpdate(Void... values) {
}
}
@Override
public void onItemClick(AdapterView<?> adapterView, View v, int position, long id) {
}
}
NewsFeedParser.java
package com.rajeshvijayakumar.parser;
import java.io.IOException;
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 org.xmlpull.v1.XmlPullParserFactory;
import com.rajeshvijayakumar.model.RSSFeed;
public class NewsFeedParser {
private InputStream urlStream;
private XmlPullParserFactory factory;
private XmlPullParser parser;
private List<RSSFeed> rssFeedList;
private RSSFeed rssFeed;
private String urlString;
private String tagName;
private String title;
private String link;
private String description;
private String category;
private String pubDate;
private String guid;
private String feedburner;
public static final String ITEM = "item";
public static final String CHANNEL = "channel";
public static final String TITLE = "title";
public static final String LINK = "link";
public static final String DESCRIPTION = "description";
public static final String CATEGORY = "category";
public static final String PUBLISHEDDATE = "pubDate";
public static final String GUID = "guid";
public static final String FEEDBURNERORIGLINK = "feedburner:origLink";
public NewsFeedParser(String urlString) {
this.urlString = urlString;
}
public static InputStream downloadUrl(String urlString) throws IOException {
URL url = new URL(urlString);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setDoInput(true);
conn.connect();
InputStream stream = conn.getInputStream();
return stream;
}
public List<RSSFeed> parse() {
try {
int count = 0;
factory = XmlPullParserFactory.newInstance();
parser = factory.newPullParser();
// urlStream = downloadUrl(urlString);
URL url = new URL("http://www.pokerlistings.com/feed/blogs");
parser.setInput(url.openConnection().getInputStream(), "UTF_8");
// parser.setInput(urlStream, null);
// URL url = new URL("http://www.rssboard.org/files/sample-rss-2.xml");
// XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
// factory.setNamespaceAware(false);
// XmlPullParser xpp = factory.newPullParser();
// xpp.setInput(url.openConnection().getInputStream(), "UTF_8");
int eventType = parser.getEventType();
boolean done = false;
rssFeed = new RSSFeed();
rssFeedList = new ArrayList<RSSFeed>();
while (eventType != XmlPullParser.END_DOCUMENT && !done) {
tagName = parser.getName();
switch (eventType) {
case XmlPullParser.START_DOCUMENT:
break;
case XmlPullParser.START_TAG:
if (tagName.equals(ITEM)) {
rssFeed = new RSSFeed();
}
if (tagName.equals(TITLE)) {
title = parser.nextText().toString();
}
if (tagName.equals(LINK)) {
link = parser.nextText().toString();
}
if (tagName.equals(DESCRIPTION)) {
description = parser.nextText().toString();
}
if (tagName.equals(CATEGORY)) {
category = parser.nextText().toString();
}
if (tagName.equals(PUBLISHEDDATE)) {
pubDate = parser.nextText().toString();
}
if (tagName.equals(GUID)) {
guid = parser.nextText().toString();
}
if (tagName.equals(FEEDBURNERORIGLINK)) {
feedburner = parser.nextText().toString();
}
break;
case XmlPullParser.END_TAG:
System.out.println(">>>>>>> NewsFeedParser END TAG");
if (tagName.equals(CHANNEL)) {
done = true;
} else if (tagName.equals(ITEM)) {
rssFeed = new RSSFeed(title, link, description, category, pubDate,
guid,
feedburner);
rssFeedList.add(rssFeed);
}
break;
}
eventType = parser.nextToken();
//eventType = parser.next();
// eventType++;
System.out.println(">>>>>>> NewsFeedParser parse method event type in ="+eventType);
}
} catch (Exception e) {
e.printStackTrace();
}
return rssFeedList;
}
}
package com.rajeshvijayakumar.parser;
导入java.io.IOException;
导入java.io.InputStream;
导入java.net.HttpURLConnection;
导入java.net.URL;
导入java.util.ArrayList;
导入java.util.List;
导入org.xmlpull.v1.XmlPullParser;
导入org.xmlpull.v1.XmlPullParserFactory;
导入com.rajeshvijayakumar.model.RSSFeed;
公共类NewsFeedParser{
私有输入流urlStream;
私营工厂;
私有xmlpull解析器;
私有列表rssFeedList;
私人RSSFeed RSSFeed;
私有字符串urlString;
私有字符串标记名;
私有字符串标题;
私有字符串链接;
私有字符串描述;
私有字符串类别;
私有字符串发布日期;
私有字符串guid;
私人串式给料机;
公共静态最终字符串ITEM=“ITEM”;
公共静态最终字符串CHANNEL=“CHANNEL”;
公共静态最终字符串TITLE=“TITLE”;
公共静态最终字符串LINK=“LINK”;
公共静态最终字符串DESCRIPTION=“DESCRIPTION”;
公共静态最终字符串CATEGORY=“CATEGORY”;
公共静态最终字符串PUBLISHEDDATE=“pubDate”;
公共静态最终字符串GUID=“GUID”;
公共静态最终字符串FEEDBURNERORIGLINK=“feedburner:origLink”;
公共NewsFeedParser(字符串urlString){
this.urlString=urlString;
}
公共静态InputStream downloadUrl(字符串urlString)引发IOException{
URL=新URL(URL字符串);
HttpURLConnection conn=(HttpURLConnection)url.openConnection();
conn.setRequestMethod(“POST”);
conn.setDoInput(真);
连接();
InputStream=conn.getInputStream();
回流;
}
公共列表解析(){
试一试{
整数计数=0;
factory=XmlPullParserFactory.newInstance();
parser=factory.newPullParser();
//urlStream=下载URL(urlString);
URL=新URL(“http://www.pokerlistings.com/feed/blogs");
setInput(url.openConnection().getInputStream(),“UTF_8”);
//setInput(urlStream,null);
//URL=新URL(“http://www.rssboard.org/files/sample-rss-2.xml");
//XmlPullParserFactory工厂=XmlPullParserFactory.newInstance();
//factory.setNamespaceAware(false);
//XmlPullParser xpp=factory.newPullParser();
//setInput(url.openConnection().getInputStream(),“UTF_8”);
int eventType=parser.getEventType();
布尔完成=假;
rssFeed=新的rssFeed();
rssFeedList=newarraylist();
while(eventType!=XmlPullParser.END_文档&&!完成){
tagName=parser.getName();
开关(事件类型){
案例XmlPullParser.START_文档:
打破
case XmlPullParser.START_标记:
if(标记名.equals(项)){
rssFeed=新的rssFeed();
}
if(标记名.equals(标题)){
title=parser.nextText().toString();
}
if(标记名.equals(链接)){
link=parser.nextText().toString();
}
if(标记名.equals(说明)){
description=parser.nextText().toString();
}
if(标记名.equals(类别)){
category=parser.nextText().toString();
}
if(标记名.equals(发布日期)){
pubDate=parser.nextText().toString();
}
if(标记名.equals(GUID)){
guid=parser.nextText().toString();
}
if(标记名.equals(FEEDBURNERORIGLINK)){
feedburner=parser.nextText().toString();
}
打破
case XmlPullParser.END_标记:
System.out.println(“>>>>>>>>NewsFeedParser结束标记”);
if(标记名.equals(通道)){
完成=正确;
}else if(标记名.equals(项)){
rssFeed=新rssFeed(标题、链接、描述、类别、发布日期、,
guid,
饲料燃烧器);
添加(rssFeed);
}
打破
}
eventType=parser.nextToken();
//eventType=parser.next();
//eventType++;
System.out.println(“>>>>>>>>NewsFeedParser解析方法事件类型in=“+eventType”);
}
}捕获(例外e){
e、 printStackTrace();
}
返回rssFeedList;
}
}
提前感谢如果您能在会议期间发布日志,那将非常有帮助call@mach对于答案,我已经在调用期间放置了日志。问题是eventType=parser.next();这一行给出了值“1”,我希望这个值是“2”。我的意思是你应该把日志记录放到你的问题中。我没有得到任何错误或异常,这里是m
package com.rajeshvijayakumar.parser;
import java.io.IOException;
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 org.xmlpull.v1.XmlPullParserFactory;
import com.rajeshvijayakumar.model.RSSFeed;
public class NewsFeedParser {
private InputStream urlStream;
private XmlPullParserFactory factory;
private XmlPullParser parser;
private List<RSSFeed> rssFeedList;
private RSSFeed rssFeed;
private String urlString;
private String tagName;
private String title;
private String link;
private String description;
private String category;
private String pubDate;
private String guid;
private String feedburner;
public static final String ITEM = "item";
public static final String CHANNEL = "channel";
public static final String TITLE = "title";
public static final String LINK = "link";
public static final String DESCRIPTION = "description";
public static final String CATEGORY = "category";
public static final String PUBLISHEDDATE = "pubDate";
public static final String GUID = "guid";
public static final String FEEDBURNERORIGLINK = "feedburner:origLink";
public NewsFeedParser(String urlString) {
this.urlString = urlString;
}
public static InputStream downloadUrl(String urlString) throws IOException {
URL url = new URL(urlString);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setDoInput(true);
conn.connect();
InputStream stream = conn.getInputStream();
return stream;
}
public List<RSSFeed> parse() {
try {
int count = 0;
factory = XmlPullParserFactory.newInstance();
parser = factory.newPullParser();
// urlStream = downloadUrl(urlString);
URL url = new URL("http://www.pokerlistings.com/feed/blogs");
parser.setInput(url.openConnection().getInputStream(), "UTF_8");
// parser.setInput(urlStream, null);
// URL url = new URL("http://www.rssboard.org/files/sample-rss-2.xml");
// XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
// factory.setNamespaceAware(false);
// XmlPullParser xpp = factory.newPullParser();
// xpp.setInput(url.openConnection().getInputStream(), "UTF_8");
int eventType = parser.getEventType();
boolean done = false;
rssFeed = new RSSFeed();
rssFeedList = new ArrayList<RSSFeed>();
while (eventType != XmlPullParser.END_DOCUMENT && !done) {
tagName = parser.getName();
switch (eventType) {
case XmlPullParser.START_DOCUMENT:
break;
case XmlPullParser.START_TAG:
if (tagName.equals(ITEM)) {
rssFeed = new RSSFeed();
}
if (tagName.equals(TITLE)) {
title = parser.nextText().toString();
}
if (tagName.equals(LINK)) {
link = parser.nextText().toString();
}
if (tagName.equals(DESCRIPTION)) {
description = parser.nextText().toString();
}
if (tagName.equals(CATEGORY)) {
category = parser.nextText().toString();
}
if (tagName.equals(PUBLISHEDDATE)) {
pubDate = parser.nextText().toString();
}
if (tagName.equals(GUID)) {
guid = parser.nextText().toString();
}
if (tagName.equals(FEEDBURNERORIGLINK)) {
feedburner = parser.nextText().toString();
}
break;
case XmlPullParser.END_TAG:
System.out.println(">>>>>>> NewsFeedParser END TAG");
if (tagName.equals(CHANNEL)) {
done = true;
} else if (tagName.equals(ITEM)) {
rssFeed = new RSSFeed(title, link, description, category, pubDate,
guid,
feedburner);
rssFeedList.add(rssFeed);
}
break;
}
eventType = parser.nextToken();
//eventType = parser.next();
// eventType++;
System.out.println(">>>>>>> NewsFeedParser parse method event type in ="+eventType);
}
} catch (Exception e) {
e.printStackTrace();
}
return rssFeedList;
}
}