返回介绍

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

发布于 2025-02-26 12:59:33 字数 9956 浏览 0 评论 0 收藏 0

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

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

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

一、创建服务器端:

服务器端项目结构:

服务器端项目结构

服务器端运行效果图:

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

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

package com.jph.server.model;

import java.util.Date;

/**
 * 新闻实体类
 * @author jph
 * Date:2014.09.26
 */
public class News {
  private Integer id;
  private String title;
  private Date publishDate;

  public News(Integer id, String title, Date publishDate) {
    this.id = id;
    this.title = title;
    this.publishDate = publishDate;
  }
  public Integer getId() {
    return id;
  }
  public void setId(Integer id) {
    this.id = id;
  }
  public String getTitle() {
    return title;
  }
  public void setTitle(String title) {
    this.title = title;
  }
  public Date getPublishDate() {
    return publishDate;
  }
  public void setPublishDate(Date publishDate) {
    this.publishDate = publishDate;
  }   
}

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

业务接口:

package com.jph.server.service;
import java.util.List;

import com.jph.server.model.News;

public interface XMLService {
  /**
   * 获取最新的资讯
   * @return
   */
  public List<News> getLastNews();

}

业务接口的实现类:

package com.jph.server.service.impl;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import com.jph.server.model.News;
import com.jph.server.service.XMLService;

public class XMLServiceBean implements XMLService {
  /**
   * 获取最新的视频资讯
   * @return
   */
  public List<News> getLastNews(){
    List<News> newes = new ArrayList<News>();
    newes.add(new News(1, "jph", new Date(System.currentTimeMillis()+100002)));
    newes.add(new News(2, "admin",new Date(System.currentTimeMillis()+330002)));
    newes.add(new News(3, "tom", new Date(System.currentTimeMillis()+180002)));
    return newes;
  }
}

第三步:创建控制器 Servlet

package com.jph.server.xml;

import java.io.IOException;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.jph.server.model.News;
import com.jph.server.service.XMLService;
import com.jph.server.service.impl.XMLServiceBean;

/**
 * 负责响应客户端的请求:http://xxx/ServerForXML/ServletForXMLServlet
 */
public class ServletForXML extends HttpServlet {
  private static final long serialVersionUID = 1L;
  private XMLService newsService = new XMLServiceBean();

  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    doPost(request, response);
  }

  protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    List<News> newes = newsService.getLastNews();//获取最新的视频资讯    
      request.setAttribute("newes", newes);
      //将客户端的请求转向 news.jsp 页面
      request.getRequestDispatcher("/WEB-INF/page/news.jsp").forward(request, response);
  }
}

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

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

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

news.jsp 页面:

<%@ 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"?>
<newslist>
  <c:forEach items="${newes}" var="news">
    <news id="${news.id}">
      <title>${news.title}</title>
      <publishDate>${news.publishDate}</publishDate>
    </news>
  </c:forEach>
</newslist>

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

二、创建 Android 端:

Android 端项目结构:

Android 端项目结构

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

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

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

核心代码:GetXmlAndParse.java:

package com.jph.gxfi.service;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.xmlpull.v1.XmlPullParser;
import com.jph.gxfi.model.News;
import android.os.Handler;
import android.os.Message;
import android.util.Xml;

/**
 * 获取网络上的 xml,并解析
 * @author jph
 * Date:2014.09.26
 */
public class GetXmlAndParse {
  private String url="http://10.219.61.117:8080/ServerForXML/ServletForXML";
  public static final int PARSESUCCWSS=0x2001;
  private Handler handler;
  public GetXmlAndParse(Handler handler) {
    // TODO Auto-generated constructor stub
    this.handler=handler;
  }
  /**
   * 获取网络上的 XML
   */
  public void getXml(){
    new Thread(new Runnable() {     
      @Override
      public void run() {
        // TODO Auto-generated method stub
        try {
          HttpURLConnection conn=(HttpURLConnection)new 
              URL(url).openConnection();
          conn.setConnectTimeout(5000);//设置连接超时
          conn.setRequestMethod("GET");
          if (conn.getResponseCode()==200) {
            InputStream inputStream=conn.getInputStream();
            List<News> listNews=pullXml(inputStream);
            if (listNews.size()>0) {//如果解析结果不为空则将解析出的数据发送给 UI 线程
              Message msg=new Message();
              msg.obj=listNews;
              msg.what=PARSESUCCWSS;
              handler.sendMessage(msg);
            }
          }
        } catch (Exception e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
        }//和服务器建立连接
      }
    }).start();
  }
  /**
   * 解析 Xml,并将其封装成
   * @param inputStream
   */
  protected List<News> pullXml(InputStream inputStream) {   
    List<News>listNews=new ArrayList<News>();
    try {
      XmlPullParser pullParser=Xml.newPullParser();
      News news=null;
      pullParser.setInput(inputStream, "utf-8");
      int eventCode=pullParser.getEventType();
      while (eventCode!=XmlPullParser.END_DOCUMENT) {
        String targetName=pullParser.getName();
        switch (eventCode) {
        case XmlPullParser.START_TAG:           
          if ("news".equals(targetName)) {//处理 news 的开始节点
            news =new News();
            news.setId(new Integer(pullParser.getAttributeValue(0)));
          }else if ("title".equals(targetName)) {
            news.setTitle(pullParser.nextText());
          }else if ("publishDate".equals(targetName)) {             
            news.setPublishDate(new Date(pullParser.nextText()));
          }
          break;
        case XmlPullParser.END_TAG:
          if ("news".equals(targetName)) {//处理 news 的结束节点
            listNews.add(news);
          }
          break;

        }
        eventCode=pullParser.next();//解析下一个节点(开始节点,结束节点)        
      }
    } catch (Exception e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
    return listNews;
  }
}

第三步:创建 Activity

package com.jph.gxfi.activity;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.jph.gxfi.R;
import com.jph.gxfi.model.News;
import com.jph.gxfi.service.GetXmlAndParse;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.app.Activity;

/**
 * 获取网络上的 xml
 * @author jph
 * Date:2014.09.26
 */
public class MainActivity extends Activity {
  private List<News>listNews;
  private ListView list;
  Handler mHandler=new Handler(){
    @Override
    public void handleMessage(Message msg) {
      // TODO Auto-generated method stub
      switch (msg.what) {
      case GetXmlAndParse.PARSESUCCWSS:
        listNews=(List<News>) msg.obj;
        initData();
        break;      
      }
      super.handleMessage(msg);
    }     
  };
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    list=(ListView)findViewById(R.id.list);
    GetXmlAndParse getXmlAndParse=new GetXmlAndParse(mHandler);
    getXmlAndParse.getXml();    
  }
  /**
   * 将解析后的 xml 填充到 ListView
   */
  protected void initData() {
    // TODO Auto-generated method stub
    List<Map<String, Object>>items=new ArrayList<Map<String,Object>>();
    for (News news:listNews) {
      Map<String, Object>item=new HashMap<String, Object>();
      item.put("id", news.getId());
      item.put("title", news.getTitle());
      item.put("time", convertDate(news.getPublishDate()));
      items.add(item);
    }
    SimpleAdapter adapter=new SimpleAdapter(this, items, R.layout.line, new String[]
        {"id","title","time"}, new int[]{R.id.tvId,R.id.tvTitle,R.id.tvTime});
    list.setAdapter(adapter);
  }
  private String convertDate(Date publishDate) {
    // TODO Auto-generated method stub
    SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH-mm-ss");     
    return sdf.format(publishDate);
  }
}

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

Android 运行效果图:

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文