利用反射机制,封装 SAX解释类,从而解释网络xml文件

利用反射机制,封装 SAX解释类,从而解释网络xml文件
  个人觉得,在android应用开发领域中,与服务器交互是必不可少的。一般都是以解释xml为主要。其实获取网络上的xml和获取本地xml原理一样,只是获取网络xml 多了一层http协议,只要大家懂得怎样发送请求和怎样获取网络数据,就能很好地做出一个网络交互应用!纯属个人见解,有说得不对的地方,多多提出。。
  
        好了,切入正题,以下是利用java的反射机制,来封装 SAX解释类,从而解释网络xml文件,假如网络访问地址, http://localhost:8080/MyJsp.jsp   会返回一个xml文件.

        首先;创建一个javabean类,这个类中的成员属性必须与xml标签一致。如果返回的xml文件如下:



     然后创建一个实体类,特别注意:成员变量与标签一致。如下



      
   
 

     再后,编写封装类:

  1. import java.io.InputStream;
  2. import java.lang.reflect.Field;
  3. import java.lang.reflect.Method;
  4. import java.net.HttpURLConnection;
  5. import java.net.URL;
  6. import java.sql.Date;
  7. import java.util.ArrayList;
  8. import java.util.List;
  9. import javax.xml.parsers.SAXParser;
  10. import javax.xml.parsers.SAXParserFactory;
  11. import org.xml.sax.Attributes;
  12. import org.xml.sax.SAXException;
  13. import org.xml.sax.helpers.DefaultHandler;

  14. /**
  15. * 封闭类
  16. * 利用 SAX 解析xml文件

  17. * @author Administrator

  18. */
  19. public class SAXParserContentHandler extends DefaultHandler {
  20. private Object javaBean = null;
  21. // 标签名称
  22. private String tag;
  23. List<Object> list = null;
  24. /**
  25.    * 用 SAX 解析xml文件
  26.    * 
  27.   * @param strUrl
  28.    *            网络xml地址
  29.    * @param javaBean
  30.    *            实体类对象
  31.    * @return List 返回实体类的一个list集合
  32.    * @throws Exception
  33.    */
  34. public List<Object> parseReadXml(String strUrl, Object javaBean)
  35.     throws Exception {
  36.    this.javaBean = javaBean;
  37.    // 要从网络上获取xml,要定义一个URL类对象
  38.    URL url = new URL(strUrl);
  39.    // 打开连接,。会返回HttpsURLConnection 对象
  40.    HttpURLConnection httpsURLConnection = (HttpURLConnection) url
  41.      .openConnection();
  42.    // 现在是使用HTTP协议请求服务器的数据
  43.    // 所以要设置请求方式
  44.    httpsURLConnection.setRequestMethod("GET");
  45.    // 设置 超时时间 为5秒
  46.    httpsURLConnection.setConnectTimeout(5 * 1000);
  47.    // 通过输入流获取网络xml内容
  48.    // 取得输入流
  49.    InputStream inputStream = httpsURLConnection.getInputStream();
  50.    SAXParserFactory parserFactory = SAXParserFactory.newInstance();
  51.    // 取得SAXParser 实例
  52.    SAXParser parser = parserFactory.newSAXParser();
  53.    parser.parse(inputStream, this);
  54.    return list;
  55. }
  56. @Override
  57. public void characters(char[] ch, int start, int length)
  58.     throws SAXException {
  59.    if (null != tag && !"".equals(tag)) {
  60.     if (javaBean != null) {
  61.      String data = new String(ch, start, length);
  62.      Field[] fields = javaBean.getClass().getDeclaredFields();
  63.      for (int i = 0; i < fields.length; i++) {
  64.       if (tag.equals(fields.getName())) {
  65.        // System.out.println(fields.getName()+" --- fields.getName(); --  "+fields.getType());
  66.        setAttribute(javaBean, fields.getName(), data,
  67.          new Class[] { fields.getType() });
  68.       }
  69.      }
  70.     }
  71.    }
  72. }
  73. @Override
  74. public void endDocument() throws SAXException {
  75. }
  76. @Override
  77. public void endElement(String uri, String localName, String qName)
  78.     throws SAXException {
  79.    System.out.println(" endElement " + localName);
  80.    if (null != localName && !"".equals(localName)) {
  81.     String bean = updateSmall(javaBean.getClass().getSimpleName());
  82.     if (bean.equals(localName) && bean != null) {
  83.      list.add(javaBean);
  84.     }
  85.    }
  86.    tag = null;
  87. }
  88. @Override
  89. public void startDocument() throws SAXException {
  90.    // TODO Auto-generated method stub
  91.    list = new ArrayList<Object>();
  92. }
  93. @Override
  94. public void startElement(String uri, String localName, String qName,
  95.     Attributes attributes) throws SAXException {
  96.    System.out.println(" startElement " + localName);
  97.    tag = qName;
  98.    // 取得实体类简单名称,把首字母变为小 写
  99.    String bean = updateSmall(javaBean.getClass().getSimpleName());
  100.    // System.out.println("bean --  "+bean);
  101.    // 取得实体类的 全限 名称
  102.    String clazz = javaBean.getClass().getName();
  103.    // System.out.println("clazz --  "+clazz);
  104.    if (bean.equals(qName)) {
  105.     try {
  106.      javaBean = Class.forName(clazz).newInstance();
  107.     } catch (Exception e) {
  108.      // TODO Auto-generated catch block
  109.      e.printStackTrace();
  110.     }
  111.     Field[] fields = javaBean.getClass().getDeclaredFields();
  112.     for (int i = 0; i < attributes.getLength(); i++) {
  113.      System.out.println(attributes.getQName(i)+" -- attributes --  "+attributes.getValue(i));
  114.      for (int j = 0; j < fields.length; j++) {
  115.       if (attributes.getQName(i).equals(fields[j].getName())) {
  116.        setAttribute(javaBean, attributes.getQName(i),
  117.          attributes.getValue(i),
  118.          new Class[] { fields[j].getType() });
  119.        System.out.println(fields[j].getName()+" --- fields.getName(); --  "+fields[j].getType().getName());
  120.       }
  121.      }
  122.     }
  123.    }
  124. }
  125. /**
  126.    * 
  127.   * @param object
  128.    *            类
  129.    * @param setName
  130.    *            方法名
  131.    * @param setValue
  132.    *            方法设置
  133.    * @param obj
  134.    *            属性类型
  135.    * @throws Exception
  136.    */
  137. public void setAttribute(Object object, String setName, String setValue,
  138.     Class[] obj) {
  139.    Method method;
  140.    try {
  141.     method = object.getClass().getMethod("set" + updateStr(setName),
  142.       obj[0]);
  143.     if (obj[0].equals(Integer.class) || obj[0].equals(int.class)) {
  144.      method.invoke(object, new Integer(setValue));
  145.     }
  146.     if (obj[0].equals(Float.class) || obj[0].equals(float.class)) {
  147.      method.invoke(object, new Float(setValue));
  148.     }
  149.     if (obj[0].equals(Short.class) || obj[0].equals(short.class)) {
  150.      method.invoke(object, new Short(setValue));
  151.     }
  152.     if (obj[0].equals(Byte.class) || obj[0].equals(byte.class)) {
  153.      method.invoke(object, new Byte(setValue));
  154.     }
  155.     if (obj[0].equals(Double.class)|| obj[0].equals(double.class)) {
  156.      method.invoke(object, new Double(setValue));
  157.     }
  158.     if (obj[0].equals(Date.class)) {
  159.      method.invoke(object, new Date(new Long(setValue)));
  160.     }
  161.     if (obj[0].equals(java.util.Date.class)) {
  162.      method.invoke(object, new java.util.Date(setValue));
  163.     }
  164.     if (obj[0].equals(Long.class)|| obj[0].equals(long.class)) {
  165.      method.invoke(object, new Long(setValue));
  166.     }
  167.     if (obj[0].equals(Boolean.class)|| obj[0].equals(boolean.class)) {
  168.      method.invoke(object, new Boolean(setValue));
  169.     }
  170.     if (obj[0].equals(String.class)) {
  171.      method.invoke(object, setValue);
  172.     }
  173.     
  174.    } catch (Exception e) {
  175.     // TODO Auto-generated catch block
  176.     e.printStackTrace();
  177.    }
  178. }
  179. /**
  180.    * 把字符串的首字母改为大写
  181.    * 
  182.   * @param str
  183.    *            :
  184.    * @return String
  185.    */
  186. public String updateStr(String str) {
  187.    char c = (char) (str.charAt(0) - 32);
  188.    String s = str.substring(1, str.length());
  189.    return c + s;
  190. }
  191. /**
  192.    * 把字符串的首字母改为小写
  193.    * 
  194.   * @param str
  195.    *            :
  196.    * @return String
  197.    */
  198. public String updateSmall(String str) {
  199.    char c = (char) (str.charAt(0) + 32);
  200.    String s = str.substring(1, str.length());
  201.    return c + s;
  202. }
  203. }
复制代码
以上的封装类已经有详细注释,最后就是怎样得到想要的数据。

     1:实例化 实体类
     2:实例化封装类
     3:把实例化类加入到contentHandler.parseReadXml方法中,如下
  1. SAXParserContentHandler contentHandler = new SAXParserContentHandler();
  2.     Video video =new Video();
  3.     List<Object> list = contentHandler.parseReadXml("http://0029.freejsp.net/0105/MyJsp.jsp",video);
  4.     
  5.     for (Object object : list) {
  6.      video = (Video)object;
  7.      System.out.println(video);
  8.     }
复制代码
结果如下:





     最后,遍历list集合,就可以得到你想要的数据.个人觉得,这样方便很多,不用再一个一个标签去比较,省下了很多时间。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值