android 反射解析xml文件成为java对象

来源:互联网 发布:小米mix2全球网络制式 编辑:程序博客网 时间:2024/05/22 14:48

ReflectResolveXML.java

Java代码
 收藏代码
  1. package com.player.handle;  
  2.   
  3. import java.lang.reflect.Field;  
  4. import java.text.ParseException;  
  5. import java.text.SimpleDateFormat;  
  6. import java.util.Collection;  
  7. import java.util.Date;  
  8. import java.util.Stack;  
  9.   
  10. import org.xml.sax.Attributes;  
  11. import org.xml.sax.SAXException;  
  12. import org.xml.sax.helpers.DefaultHandler;  
  13.   
  14. public class ReflectResolveXML extends DefaultHandler {  
  15.     public static final String T_COLLECTION="collection";  
  16.     public static final String T_OBJECT="object";  
  17.     public static final String T_LANG="lang";  
  18.     private static final String T_DATE = "date";  
  19.     private static final String D_PATTERN = "yyyy-MM-dd HH:mm:ss";  
  20.     Stack<Object> stack=new Stack<Object>();  
  21.     private Object root=null;  
  22.     public Object getRoot() {  
  23.         return root;  
  24.     }  
  25.   
  26.     @Override  
  27.     public void endElement(String uri, String localName, String qName)  
  28.             throws SAXException {  
  29.     //  System.out.println("endElement:"+uri+" localName:"+localName+ " qName:"+qName);  
  30.         if (qName.equals(T_OBJECT)||qName.equals(T_COLLECTION)) {  
  31.             //如果集合类或者object类 属性注入完成则需要弹出堆栈  
  32.             stack.pop();  
  33.         }  
  34.     }  
  35.     @Override  
  36.     public void startElement(String uri, String localName, String qName,  
  37.             Attributes attributes) throws SAXException {  
  38.         // TODO Auto-generated method stu  
  39.         StringBuffer stb=new StringBuffer();  
  40.         for (int i = 0; i < attributes.getLength(); i++) {  
  41.             stb.append(attributes.getValue(i)+"---")    ;  
  42.         }  
  43.         System.out.println("startElement:"+uri+" localName:"+localName+ " qName:"+qName+" Attr: "+stb.toString());  
  44.         //如果根元素为null  则新建一个 因为第一个读取的必定是根元素  
  45.         String type=attributes.getValue("type");  
  46.         if (root==null) {  
  47.             root=instanceObjectByType(type);   
  48.             stack.push(root);  
  49.             return;  
  50.         }  
  51.         String value=attributes.getValue("value");  
  52.         String name=attributes.getValue("name");  
  53.         Object pObj=stack.peek();  
  54.             //根元素不为空 则根据 qname判断   
  55.             if (qName.equals(T_COLLECTION)||qName.equals(T_OBJECT)) {  
  56.                 //如果是list则new 一个list 或者 object 则new出来  
  57.                 Object obj=instanceObjectByType(type);  
  58.                 stack.push(obj);  
  59.                 injectToParent(pObj, obj,name);  
  60.             }else if (qName.equals(T_LANG)) {  
  61.                 //如果是lang 则需要转化value值  
  62.                 Object valueObj=typeConvert(type, value);  
  63.                 injectToParent(pObj,valueObj,name);  
  64.             }else if (qName.equals(T_DATE)) {  
  65.                 //如果是date  
  66.                 String pattern=attributes.getValue("pattern");  
  67.                 if (pattern==null) {  
  68.                     pattern=D_PATTERN;  
  69.                 }  
  70.                 Object valueObj=typeConvertDate(value,pattern);  
  71.                 injectToParent(pObj,valueObj,name);  
  72.             }  
  73.     }  
  74.   
  75.   
  76.       
  77.     //转化date类型  
  78.     private Date typeConvertDate( String value, String pattern) {  
  79.         SimpleDateFormat sdf=new SimpleDateFormat(pattern);  
  80.         Date date;  
  81.         try {  
  82.             date = sdf.parse(value);  
  83.             return date;  
  84.         } catch (ParseException e) {  
  85.             // TODO Auto-generated catch block  
  86.             e.printStackTrace();  
  87.         }  
  88.         return null;  
  89.     }  
  90.   
  91.     //向上一级元素中注入属性 或者向集合类中add子元素  
  92.     private void injectToParent(Object pObj, Object fieldValue ,String fieldName) {  
  93.         if (pObj instanceof Collection) {  
  94.             //如果上一级是集合类 则需要添加进去  
  95.             ((Collection) pObj).add(fieldValue);  
  96.             return ;  
  97.         }  
  98.         //如果上一级是object 则需要反射字段赋值  
  99.         Field[] fields = pObj.getClass().getDeclaredFields();  
  100.         for (Field field : fields) {  
  101.             if (field.getName().equals(fieldName)) {  
  102.                 try {  
  103.                     field.setAccessible(true);  
  104.                     field.set(pObj, fieldValue);  
  105.                 } catch (IllegalArgumentException e) {  
  106.                     // TODO Auto-generated catch block  
  107.                     e.printStackTrace();  
  108.                 } catch (IllegalAccessException e) {  
  109.                 // TODO Auto-generated catch block  
  110.                     e.printStackTrace();  
  111.                 }  
  112.                 break;  
  113.             }  
  114.         }  
  115.     }  
  116.   
  117.     //反射实例化对象  
  118.     private Object instanceObjectByType(String qName) {  
  119.         try {  
  120.             Class localClass= Class.forName(qName);  
  121.             Object obj=localClass.getConstructor().newInstance();  
  122.             return obj;   
  123.               
  124.         } catch (Exception e) {  
  125.             // TODO Auto-generated catch block  
  126.             e.printStackTrace();  
  127.             throw new RuntimeException(e);  
  128.         }  
  129.       
  130.     }  
  131.       
  132.     // 此方法用于将一个字符串转换为相应的数据类型  
  133.     public Object typeConvert(String className, String value) {  
  134.         if (className.equals("java.lang.String")) {  
  135.             return value;  
  136.         } else if (className.equals("java.lang.Integer")) {  
  137.             return Integer.valueOf(value);  
  138.         } else if (className.equals("java.lang.Long")) {  
  139.             return Long.valueOf(value);  
  140.         } else if (className.equals("java.lang.Boolean")) {  
  141.             return Boolean.valueOf(value);  
  142.         } else if (className.equals("java.lang.Float")) {  
  143.             return Float.valueOf(value);  
  144.         } else if (className.equals("java.lang.Double")) {  
  145.             return Double.valueOf(value);  
  146.         } else  
  147.             return null;  
  148.     }   
  149.       
  150.       
  151. }  

 reflect.xml文件

Xml代码
 收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <collecton type="java.util.ArrayList">  
  3.     <object type="com.player.module.Resource">  
  4.         <lang type="java.lang.String" name="id" value="0001"></lang>  
  5.         <object type="com.player.module.Mp3" name="mp3">  
  6.                 <lang type="java.lang.String" name="mp3Name" value="天地初开的时候.mp3"></lang>  
  7.                 <lang type="java.lang.Integer" name="mp3Size" value="12333"></lang>  
  8.         </object>  
  9.         <object type="com.player.module.Lrc" name="lrc">  
  10.                 <lang type="java.lang.String" name="lrcName" value="天地初开的时候.lrc"></lang>  
  11.                 <lang type="java.lang.Integer" name="lrcSize" value="4312"></lang>  
  12.         </object>  
  13.         <date type="java.util.Date" name="date" value="2001-12-12 12:12:12"></date>  
  14.     </object>  
  15.       
  16.     <object type="com.player.module.Resource">  
  17.         <lang type="java.lang.String" name="id" value="0002"></lang>  
  18.         <object type="com.player.module.Mp3" name="mp3">  
  19.                 <lang type="java.lang.String" name="mp3Name" value="那一曲盛放的玫瑰.mp3"></lang>  
  20.                 <lang type="java.lang.Integer" name="mp3Size" value="12333"></lang>  
  21.         </object>  
  22.         <object type="com.player.module.Lrc" name="lrc">  
  23.                 <lang type="java.lang.String" name="lrcName" value="那一曲盛放的玫瑰.lrc"></lang>  
  24.                 <lang type="java.lang.Integer" name="lrcSize" value="4312"></lang>  
  25.         </object>  
  26.         <date type="java.util.Date" name="date" value="2001-12-13 12:12:12"></date>  
  27.     </object>  
  28. </collecton>  

 HandleTest.java

Java代码
 收藏代码
  1. package com.player.handle;  
  2.   
  3. import java.io.File;  
  4. import java.io.IOException;  
  5. import java.util.List;  
  6.   
  7. import javax.xml.parsers.ParserConfigurationException;  
  8. import javax.xml.parsers.SAXParser;  
  9. import javax.xml.parsers.SAXParserFactory;  
  10.   
  11. import org.junit.Test;  
  12. import org.xml.sax.SAXException;  
  13.   
  14. import com.player.module.Resource;  
  15.   
  16.   
  17. public class HandleTest  {  
  18.       
  19.     @Test  
  20.     public void testresolveXmlTest() throws ParserConfigurationException, SAXException, IOException{  
  21.     //  HttpDownloader downloader=new HttpDownloader();  
  22.     //  String xml= downloader.download(Mp3ListActiviy.URL);  
  23.         File file=new java.io.File("D:\\Soft\\Program\\Apache-Tomcat-6.0.20\\webapps\\android_mp3\\reflect.xml");  
  24.         SAXParser saxParser=SAXParserFactory.newInstance().newSAXParser();  
  25.         ReflectResolveXML reflectResolveXML=new ReflectResolveXML();  
  26.         saxParser.parse(file, reflectResolveXML);  
  27.         List<Resource> resources=(List<Resource>) reflectResolveXML.getRoot();  
  28.         System.out.println("---------------------");  
  29.         for (Resource resource : resources) {  
  30.             System.out.println(resource.toString());  
  31.         }  
  32.         //mp3xmlHandle.getMp3List();  
  33.     }  
  34.       
  35.       
  36. }  

 三个javabean

Java代码
 收藏代码
  1. public class Lrc {  
  2.     private String lrcName;  
  3.     private Integer lrcSize;  
  4. }  
  5.   
  6.   
  7. public class Mp3 {  
  8.     private String mp3Name;  
  9.     private int mp3Size;  
  10. }  
  11.   
  12. public class Resource {  
  13.     private String id;  
  14.     private Mp3 mp3;  
  15.     private Lrc lrc;  
  16.     private Date date;  
  17. }  
 
原创粉丝点击