Android 使用xml从rss提要获取数据,然后存储在ArrayList中
我正在制作一个android应用程序来从rss提要获取数据Android 使用xml从rss提要获取数据,然后存储在ArrayList中,android,rss,xsd,Android,Rss,Xsd,我正在制作一个android应用程序来从rss提要获取数据 任何人都可以提出一个想法,从xml中获取值gsx:brand并将其存储在Arraylist中这是我所做的一个示例,您可以查看此示例并进行相应的操作 mainsdemo.java public class MainRSSDemo extends Activity { private List<Message> messages; static String feedUrl = "http://rss.news
任何人都可以提出一个想法,从xml中获取值gsx:brand并将其存储在Arraylist中这是我所做的一个示例,您可以查看此示例并进行相应的操作 mainsdemo.java
public class MainRSSDemo extends Activity {
private List<Message> messages;
static String feedUrl = "http://rss.news.yahoo.com/rss/terrorism";
static final String RSS = "rss";
static final String CHANNEL = "channel";
static final String ITEM = "item";
static final String PUB_DATE = "pubDate";
static final String DESCRIPTION = "description";
static final String LINK = "link";
static final String TITLE = "title";
static final String URL = "url";
static final String MEDIA = "content";
private InputStream is;
private URL feed_Url = null;
private ListView lv;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
lv =(ListView)findViewById(R.id.ListView01);
try {
feed_Url = new URL(feedUrl);
is = feed_Url.openConnection().getInputStream();
messages = parse();
is.close();
} catch (Exception e) {
Log.i("err", e.toString());
e.printStackTrace();
}
final List<String> titles = new ArrayList<String>(messages.size());
for (Message msg : messages){
titles.add(msg.getTitle());
}
lv.setAdapter(new ArrayAdapter<String>(this,R.layout.row,titles));
lv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int position,long id) {
Toast.makeText(getBaseContext(),titles.get(position), Toast.LENGTH_LONG).show();
}
});
}
public List<Message> parse() {
List<Message> messages = null;
XmlPullParser parser = Xml.newPullParser();
try {
parser.setInput(is, null);
int eventType = parser.getEventType();
Message currentMessage = null;
boolean done = false;
while (eventType != XmlPullParser.END_DOCUMENT && !done){
String name = null;
switch (eventType){
case XmlPullParser.START_DOCUMENT:
messages = new ArrayList<Message>();
break;
case XmlPullParser.START_TAG:
name = parser.getName();
if (name.equalsIgnoreCase(ITEM)) {
currentMessage = new Message();
} else if (currentMessage != null) {
if (name.equalsIgnoreCase(LINK)) {
currentMessage.setLink(parser.nextText());
} else if (name.equalsIgnoreCase(DESCRIPTION)) {
String parse = parser.nextText().toString();
if (parse.contains("</a>")) {
parse = parse.substring(parse.indexOf("</a>") + 4, parse.lastIndexOf("</p>"));
currentMessage.setDescription(parse.toString());
} else {
currentMessage.setDescription(parse);
}
} else if (name.equalsIgnoreCase(PUB_DATE)) {
currentMessage.setDate(parser.nextText());
} else if (name.equalsIgnoreCase(TITLE)) {
currentMessage.setTitle(parser.nextText());
} else if (name.equalsIgnoreCase(MEDIA)) {
currentMessage.setImageUrl(parser.getAttributeValue(0));
parser.nextText();
}
}
break;
case XmlPullParser.END_TAG:
name = parser.getName();
if (name.equalsIgnoreCase(ITEM) && currentMessage != null){
messages.add(currentMessage);
} else if (name.equalsIgnoreCase(CHANNEL)){
done = true;
}
break;
}
eventType = parser.next();
}
} catch (Exception e) {
Log.e("AndroidNews::PullFeedParser", e.getMessage(), e);
throw new RuntimeException(e);
}
return messages;
}
}
public class Message implements Comparable<Message> {
static SimpleDateFormat FORMATTER = new SimpleDateFormat(
"EEE, dd MMM yyyy HH:mm:ss Z");
private String title;
private URL link;
private String description;
private Date date;
private String image_url;
public void setImageUrl(String ImageUrl) {
image_url = ImageUrl;
}
public String getImageUrl() {
return image_url;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title.trim();
}
// getters and setters omitted for brevity
public URL getLink() {
return link;
}
public void setLink(String link) {
try {
this.link = new URL(link);
} catch (MalformedURLException e) {
throw new RuntimeException(e);
}
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description.trim();
}
public String getDate() {
return FORMATTER.format(this.date);
}
public void setDate(String date) {
// pad the date if necessary
while (!date.endsWith("00")) {
date += "0";
}
try {
this.date = FORMATTER.parse(date.trim());
} catch (ParseException e) {
throw new RuntimeException(e);
}
}
public Message copy() {
Message copy = new Message();
copy.title = title;
copy.link = link;
copy.description = description;
copy.date = date;
return copy;
}
public int compareTo(Message another) {
if (another == null)
return 1;
// sort descending, most recent first
return another.date.compareTo(date);
}
}
public类mainsdemo扩展活动{
私人列表消息;
静态字符串feedUrl=”http://rss.news.yahoo.com/rss/terrorism";
静态最终字符串RSS=“RSS”;
静态最终字符串通道=“通道”;
静态最终字符串ITEM=“ITEM”;
静态最终字符串PUB_DATE=“pubDate”;
静态最终字符串DESCRIPTION=“DESCRIPTION”;
静态最终字符串LINK=“LINK”;
静态最终字符串TITLE=“TITLE”;
静态最终字符串URL=“URL”;
静态最终字符串MEDIA=“content”;
私有输入流是;
私有URL提要_URL=null;
私有ListView lv;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
lv=(ListView)findViewById(R.id.ListView01);
试一试{
feed_Url=新Url(feedUrl);
is=feed_Url.openConnection().getInputStream();
messages=parse();
is.close();
}捕获(例外e){
Log.i(“err”,例如toString());
e、 printStackTrace();
}
最终列表标题=新的ArrayList(messages.size());
用于(消息消息:消息){
titles.add(msg.getTitle());
}
lv.setAdapter(新的ArrayAdapter(本,右布局行,标题));
lv.setOnItemClickListener(新的OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView arg0、视图arg1、整型位置、长id){
Toast.makeText(getBaseContext(),titles.get(position),Toast.LENGTH_LONG.show();
}
});
}
公共列表解析(){
列表消息=null;
XmlPullParser=Xml.newPullParser();
试一试{
setInput(is,null);
int eventType=parser.getEventType();
Message currentMessage=null;
布尔完成=假;
while(eventType!=XmlPullParser.END_文档&&!完成){
字符串名称=null;
开关(事件类型){
案例XmlPullParser.START_文档:
messages=newarraylist();
打破
case XmlPullParser.START_标记:
name=parser.getName();
if(名称等信号案例(项目)){
currentMessage=新消息();
}else if(currentMessage!=null){
if(name.equalsIgnoreCase(LINK)){
currentMessage.setLink(parser.nextText());
}else if(名称、相等信号案例(说明)){
字符串解析=parser.nextText().toString();
if(parse.contains(“”){
parse=parse.substring(parse.indexOf(“”+4,parse.lastIndexOf(“”);
currentMessage.setDescription(parse.toString());
}否则{
currentMessage.setDescription(解析);
}
}else if(名称、同等信号案例(发布日期)){
currentMessage.setDate(parser.nextText());
}else if(名称、相等信号案例(标题)){
currentMessage.setTitle(parser.nextText());
}else if(name.equalsIgnoreCase(媒体)){
currentMessage.setImageUrl(parser.getAttributeValue(0));
parser.nextText();
}
}
打破
case XmlPullParser.END_标记:
name=parser.getName();
if(name.equalsIgnoreCase(ITEM)&¤tMessage!=null){
messages.add(当前消息);
}else if(名称.相等信号(通道)){
完成=正确;
}
打破
}
eventType=parser.next();
}
}捕获(例外e){
e(“AndroidNews::PullFeedParser”,e.getMessage(),e);
抛出新的运行时异常(e);
}
返回消息;
}
}
Message.java
public class MainRSSDemo extends Activity {
private List<Message> messages;
static String feedUrl = "http://rss.news.yahoo.com/rss/terrorism";
static final String RSS = "rss";
static final String CHANNEL = "channel";
static final String ITEM = "item";
static final String PUB_DATE = "pubDate";
static final String DESCRIPTION = "description";
static final String LINK = "link";
static final String TITLE = "title";
static final String URL = "url";
static final String MEDIA = "content";
private InputStream is;
private URL feed_Url = null;
private ListView lv;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
lv =(ListView)findViewById(R.id.ListView01);
try {
feed_Url = new URL(feedUrl);
is = feed_Url.openConnection().getInputStream();
messages = parse();
is.close();
} catch (Exception e) {
Log.i("err", e.toString());
e.printStackTrace();
}
final List<String> titles = new ArrayList<String>(messages.size());
for (Message msg : messages){
titles.add(msg.getTitle());
}
lv.setAdapter(new ArrayAdapter<String>(this,R.layout.row,titles));
lv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int position,long id) {
Toast.makeText(getBaseContext(),titles.get(position), Toast.LENGTH_LONG).show();
}
});
}
public List<Message> parse() {
List<Message> messages = null;
XmlPullParser parser = Xml.newPullParser();
try {
parser.setInput(is, null);
int eventType = parser.getEventType();
Message currentMessage = null;
boolean done = false;
while (eventType != XmlPullParser.END_DOCUMENT && !done){
String name = null;
switch (eventType){
case XmlPullParser.START_DOCUMENT:
messages = new ArrayList<Message>();
break;
case XmlPullParser.START_TAG:
name = parser.getName();
if (name.equalsIgnoreCase(ITEM)) {
currentMessage = new Message();
} else if (currentMessage != null) {
if (name.equalsIgnoreCase(LINK)) {
currentMessage.setLink(parser.nextText());
} else if (name.equalsIgnoreCase(DESCRIPTION)) {
String parse = parser.nextText().toString();
if (parse.contains("</a>")) {
parse = parse.substring(parse.indexOf("</a>") + 4, parse.lastIndexOf("</p>"));
currentMessage.setDescription(parse.toString());
} else {
currentMessage.setDescription(parse);
}
} else if (name.equalsIgnoreCase(PUB_DATE)) {
currentMessage.setDate(parser.nextText());
} else if (name.equalsIgnoreCase(TITLE)) {
currentMessage.setTitle(parser.nextText());
} else if (name.equalsIgnoreCase(MEDIA)) {
currentMessage.setImageUrl(parser.getAttributeValue(0));
parser.nextText();
}
}
break;
case XmlPullParser.END_TAG:
name = parser.getName();
if (name.equalsIgnoreCase(ITEM) && currentMessage != null){
messages.add(currentMessage);
} else if (name.equalsIgnoreCase(CHANNEL)){
done = true;
}
break;
}
eventType = parser.next();
}
} catch (Exception e) {
Log.e("AndroidNews::PullFeedParser", e.getMessage(), e);
throw new RuntimeException(e);
}
return messages;
}
}
public class Message implements Comparable<Message> {
static SimpleDateFormat FORMATTER = new SimpleDateFormat(
"EEE, dd MMM yyyy HH:mm:ss Z");
private String title;
private URL link;
private String description;
private Date date;
private String image_url;
public void setImageUrl(String ImageUrl) {
image_url = ImageUrl;
}
public String getImageUrl() {
return image_url;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title.trim();
}
// getters and setters omitted for brevity
public URL getLink() {
return link;
}
public void setLink(String link) {
try {
this.link = new URL(link);
} catch (MalformedURLException e) {
throw new RuntimeException(e);
}
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description.trim();
}
public String getDate() {
return FORMATTER.format(this.date);
}
public void setDate(String date) {
// pad the date if necessary
while (!date.endsWith("00")) {
date += "0";
}
try {
this.date = FORMATTER.parse(date.trim());
} catch (ParseException e) {
throw new RuntimeException(e);
}
}
public Message copy() {
Message copy = new Message();
copy.title = title;
copy.link = link;
copy.description = description;
copy.date = date;
return copy;
}
public int compareTo(Message another) {
if (another == null)
return 1;
// sort descending, most recent first
return another.date.compareTo(date);
}
}
公共类消息实现可比较{
静态SimpleDataFormat格式化程序=新SimpleDataFormat(
“EEE,dd MMM yyyy HH:mm:ss Z”);
私有字符串标题;
专用URL链接;
私有字符串描述;
私人日期;
私有字符串图像的url;
public void setImageUrl(字符串ImageUrl){
image_url=ImageUrl;
}
公共字符串getImageUrl(){
返回图片地址;
}
公共字符串getTitle(){
返回标题;
}
公共无效集合标题(字符串标题){
this.title=title.trim();
}
//为简洁起见省略了getter和setter
公共URL getLink(){
返回链接;
}
公共无效设置链接(字符串链接){
试一试{
this.link=新URL(link);
}捕获(格式错误){
抛出新的运行时异常(e);
}
}
公共字符串getDescription(){
返回说明;
}
公共void集合描述(字符串描述){
this.description=description.trim();
}
公共字符串getDate(){
返回格式化程序.format(此.date);
}
公共无效设置日期(字符串日期){
//如有必要,请填写日期
虽然