Android 使用xml从rss提要获取数据,然后存储在ArrayList中

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

我正在制作一个android应用程序来从rss提要获取数据


任何人都可以提出一个想法,从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);
}
公共无效设置日期(字符串日期){
//如有必要,请填写日期
虽然