Android网络编程之获取网络上的XML

请尊重他人的劳动成果,转载请注明出处:Android网络编程之获取网络上的XML

为要获取网络上的XML所以需要服务器端提供的支持。

一、创建服务器端:

服务器端项目结构:

服务器端项目结构

服务器端运行效果图:

获取网上的XML服务器端运行效果图

第一步:创建业务所需的JavaBean

  1. package com.jph.server.model;
  2. import java.util.Date;
  3. /**
  4. * 新闻实体类
  5. * @author jph
  6. * Date:2014.09.26
  7. */
  8. public class News {
  9. private Integer id;
  10. private String title;
  11. private Date publishDate;
  12. public News(Integer id, String title, Date publishDate) {
  13. this.id = id;
  14. this.title = title;
  15. this.publishDate = publishDate;
  16. }
  17. public Integer getId() {
  18. return id;
  19. }
  20. public void setId(Integer id) {
  21. this.id = id;
  22. }
  23. public String getTitle() {
  24. return title;
  25. }
  26. public void setTitle(String title) {
  27. this.title = title;
  28. }
  29. public Date getPublishDate() {
  30. return publishDate;
  31. }
  32. public void setPublishDate(Date publishDate) {
  33. this.publishDate = publishDate;
  34. }
  35. }
  36.  

第二步:创建业务逻辑接口和具体实现类

业务接口:

  1. package com.jph.server.service;
  2. import java.util.List;
  3. import com.jph.server.model.News;
  4. public interface XMLService {
  5. /**
  6. * 获取最新的资讯
  7. * @return
  8. */
  9. public List<News> getLastNews();
  10. }

业务接口的实现类:

  1. package com.jph.server.service.impl;
  2. import java.util.ArrayList;
  3. import java.util.Date;
  4. import java.util.List;
  5. import com.jph.server.model.News;
  6. import com.jph.server.service.XMLService;
  7. public class XMLServiceBean implements XMLService {
  8. /**
  9. * 获取最新的视频资讯
  10. * @return
  11. */
  12. public List<News> getLastNews(){
  13. List<News> newes = new ArrayList<News>();
  14. newes.add(new News(1, "jph", new Date(System.currentTimeMillis()+100002)));
  15. newes.add(new News(2, "admin",new Date(System.currentTimeMillis()+330002)));
  16. newes.add(new News(3, "tom", new Date(System.currentTimeMillis()+180002)));
  17. return newes;
  18. }
  19. }
  20.  

第三步:创建控制器Servlet

  1. package com.jph.server.xml;
  2. import java.io.IOException;
  3. import java.util.List;
  4. import javax.servlet.ServletException;
  5. import javax.servlet.http.HttpServlet;
  6. import javax.servlet.http.HttpServletRequest;
  7. import javax.servlet.http.HttpServletResponse;
  8. import com.jph.server.model.News;
  9. import com.jph.server.service.XMLService;
  10. import com.jph.server.service.impl.XMLServiceBean;
  11. /**
  12. * 负责响应客户端的请求:http://xxx/ServerForXML/ServletForXMLServlet
  13. */
  14. public class ServletForXML extends HttpServlet {
  15. private static final long serialVersionUID = 1L;
  16. private XMLService newsService = new XMLServiceBean();
  17. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  18. doPost(request, response);
  19. }
  20. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  21. List<News> newes = newsService.getLastNews();//获取最新的视频资讯
  22. request.setAttribute("newes", newes);
  23. //将客户端的请求转向news.jsp页面
  24. request.getRequestDispatcher("/WEB-INF/page/news.jsp").forward(request, response);
  25. }
  26. }
  27.  

第四步:使用jstl标签生成XML文件

因此需要使用jstl标签所以需要将jstl.jar与standard.jar两个jar包导入项目中。

使用jstl标签在jsp页面生成XML:

news.jsp页面:

  1. <%@ page language="java" contentType="text/xml; charset=UTF-8" pageEncoding="UTF-8"%><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%><?xml version="1.0" encoding="UTF-8"?>
  2. <newslist>
  3. <c:forEach items="${newes}" var="news">
  4. <news id="${news.id}">
  5. <title>${news.title}</title>
  6. <publishDate>${news.publishDate}</publishDate>
  7. </news>
  8. </c:forEach>
  9. </newslist>

至此服务器端项目已经完成。下面开始创建Android端项目。

二、创建Android端:

Android端项目结构:

Android端项目结构

第一步:创建业务所需的JavaBean

提示:因为服务器端和Android端项目都是用Java语言实现的,所以一些组件可以共用,JavaBean便是其中之一。此时我们在搭建Android端项目的时候,完全可以将服务器端项目中JavaBean拿来用。

第二步:创建Android端项目的业务逻辑层

核心代码:GetXmlAndParse.java:

  1. package com.jph.gxfi.service;
  2. import java.io.InputStream;
  3. import java.net.HttpURLConnection;
  4. import java.net.URL;
  5. import java.util.ArrayList;
  6. import java.util.Date;
  7. import java.util.List;
  8. import org.xmlpull.v1.XmlPullParser;
  9. import com.jph.gxfi.model.News;
  10. import android.os.Handler;
  11. import android.os.Message;
  12. import android.util.Xml;
  13. /**
  14. * 获取网络上的xml,并解析
  15. * @author jph
  16. * Date:2014.09.26
  17. */
  18. public class GetXmlAndParse {
  19. private String url="http://10.219.61.117:8080/ServerForXML/ServletForXML";
  20. public static final int PARSESUCCWSS=0x2001;
  21. private Handler handler;
  22. public GetXmlAndParse(Handler handler) {
  23. // TODO Auto-generated constructor stub
  24. this.handler=handler;
  25. }
  26. /**
  27. * 获取网络上的XML
  28. */
  29. public void getXml(){
  30. new Thread(new Runnable() {
  31. @Override
  32. public void run() {
  33. // TODO Auto-generated method stub
  34. try {
  35. HttpURLConnection conn=(HttpURLConnection)new
  36. URL(url).openConnection();
  37. conn.setConnectTimeout(5000);//设置连接超时
  38. conn.setRequestMethod("GET");
  39. if (conn.getResponseCode()==200) {
  40. InputStream inputStream=conn.getInputStream();
  41. List<News> listNews=pullXml(inputStream);
  42. if (listNews.size()>0) {//如果解析结果不为空则将解析出的数据发送给UI线程
  43. Message msg=new Message();
  44. msg.obj=listNews;
  45. msg.what=PARSESUCCWSS;
  46. handler.sendMessage(msg);
  47. }
  48. }
  49. } catch (Exception e) {
  50. // TODO Auto-generated catch block
  51. e.printStackTrace();
  52. }//和服务器建立连接
  53. }
  54. }).start();
  55. }
  56. /**
  57. * 解析Xml,并将其封装成
  58. * @param inputStream
  59. */
  60. protected List<News> pullXml(InputStream inputStream) {
  61. List<News>listNews=new ArrayList<News>();
  62. try {
  63. XmlPullParser pullParser=Xml.newPullParser();
  64. News news=null;
  65. pullParser.setInput(inputStream, "utf-8");
  66. int eventCode=pullParser.getEventType();
  67. while (eventCode!=XmlPullParser.END_DOCUMENT) {
  68. String targetName=pullParser.getName();
  69. switch (eventCode) {
  70. case XmlPullParser.START_TAG:
  71. if ("news".equals(targetName)) {//处理news的开始节点
  72. news =new News();
  73. news.setId(new Integer(pullParser.getAttributeValue(0)));
  74. }else if ("title".equals(targetName)) {
  75. news.setTitle(pullParser.nextText());
  76. }else if ("publishDate".equals(targetName)) {
  77. news.setPublishDate(new Date(pullParser.nextText()));
  78. }
  79. break;
  80. case XmlPullParser.END_TAG:
  81. if ("news".equals(targetName)) {//处理news的结束节点
  82. listNews.add(news);
  83. }
  84. break;
  85. }
  86. eventCode=pullParser.next();//解析下一个节点(开始节点,结束节点)
  87. }
  88. } catch (Exception e) {
  89. // TODO Auto-generated catch block
  90. e.printStackTrace();
  91. }
  92. return listNews;
  93. }
  94. }
  95.  

第三步:创建Activity

  1. package com.jph.gxfi.activity;
  2. import java.text.SimpleDateFormat;
  3. import java.util.ArrayList;
  4. import java.util.Date;
  5. import java.util.HashMap;
  6. import java.util.List;
  7. import java.util.Map;
  8. import com.jph.gxfi.R;
  9. import com.jph.gxfi.model.News;
  10. import com.jph.gxfi.service.GetXmlAndParse;
  11. import android.os.Bundle;
  12. import android.os.Handler;
  13. import android.os.Message;
  14. import android.widget.ListView;
  15. import android.widget.SimpleAdapter;
  16. import android.app.Activity;
  17. /**
  18. * 获取网络上的xml
  19. * @author jph
  20. * Date:2014.09.26
  21. */
  22. public class MainActivity extends Activity {
  23. private List<News>listNews;
  24. private ListView list;
  25. Handler mHandler=new Handler(){
  26. @Override
  27. public void handleMessage(Message msg) {
  28. // TODO Auto-generated method stub
  29. switch (msg.what) {
  30. case GetXmlAndParse.PARSESUCCWSS:
  31. listNews=(List<News>) msg.obj;
  32. initData();
  33. break;
  34. }
  35. super.handleMessage(msg);
  36. }
  37. };
  38. @Override
  39. protected void onCreate(Bundle savedInstanceState) {
  40. super.onCreate(savedInstanceState);
  41. setContentView(R.layout.activity_main);
  42. list=(ListView)findViewById(R.id.list);
  43. GetXmlAndParse getXmlAndParse=new GetXmlAndParse(mHandler);
  44. getXmlAndParse.getXml();
  45. }
  46. /**
  47. * 将解析后的xml填充到ListView
  48. */
  49. protected void initData() {
  50. // TODO Auto-generated method stub
  51. List<Map<String, Object>>items=new ArrayList<Map<String,Object>>();
  52. for (News news:listNews) {
  53. Map<String, Object>item=new HashMap<String, Object>();
  54. item.put("id", news.getId());
  55. item.put("title", news.getTitle());
  56. item.put("time", convertDate(news.getPublishDate()));
  57. items.add(item);
  58. }
  59. SimpleAdapter adapter=new SimpleAdapter(this, items, R.layout.line, new String[]
  60. {"id","title","time"}, new int[]{R.id.tvId,R.id.tvTitle,R.id.tvTime});
  61. list.setAdapter(adapter);
  62. }
  63. private String convertDate(Date publishDate) {
  64. // TODO Auto-generated method stub
  65. SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH-mm-ss");
  66. return sdf.format(publishDate);
  67. }
  68. }
  69.  

至此Android端项目已经完成了。下面就让我们看一下APP运行效果吧:

Android运行效果图:

获取网上的XML Android端运行效果图