android 反射解析xml文件成为java对象
16lz
2021-01-23
ReflectResolveXML.java
Java代码
- packagecom.player.handle;
- importjava.lang.reflect.Field;
- importjava.text.ParseException;
- importjava.text.SimpleDateFormat;
- importjava.util.Collection;
- importjava.util.Date;
- importjava.util.Stack;
- importorg.xml.sax.Attributes;
- importorg.xml.sax.SAXException;
- importorg.xml.sax.helpers.DefaultHandler;
- publicclassReflectResolveXMLextendsDefaultHandler{
- publicstaticfinalStringT_COLLECTION="collection";
- publicstaticfinalStringT_OBJECT="object";
- publicstaticfinalStringT_LANG="lang";
- privatestaticfinalStringT_DATE="date";
- privatestaticfinalStringD_PATTERN="yyyy-MM-ddHH:mm:ss";
- Stack<Object>stack=newStack<Object>();
- privateObjectroot=null;
- publicObjectgetRoot(){
- returnroot;
- }
- @Override
- publicvoidendElement(Stringuri,StringlocalName,StringqName)
- throwsSAXException{
- //System.out.println("endElement:"+uri+"localName:"+localName+"qName:"+qName);
- if(qName.equals(T_OBJECT)||qName.equals(T_COLLECTION)){
- //如果集合类或者object类属性注入完成则需要弹出堆栈
- stack.pop();
- }
- }
- @Override
- publicvoidstartElement(Stringuri,StringlocalName,StringqName,
- Attributesattributes)throwsSAXException{
- //TODOAuto-generatedmethodstu
- StringBufferstb=newStringBuffer();
- for(inti=0;i<attributes.getLength();i++){
- stb.append(attributes.getValue(i)+"---");
- }
- System.out.println("startElement:"+uri+"localName:"+localName+"qName:"+qName+"Attr:"+stb.toString());
- //如果根元素为null则新建一个因为第一个读取的必定是根元素
- Stringtype=attributes.getValue("type");
- if(root==null){
- root=instanceObjectByType(type);
- stack.push(root);
- return;
- }
- Stringvalue=attributes.getValue("value");
- Stringname=attributes.getValue("name");
- ObjectpObj=stack.peek();
- //根元素不为空则根据qname判断
- if(qName.equals(T_COLLECTION)||qName.equals(T_OBJECT)){
- //如果是list则new一个list或者object则new出来
- Objectobj=instanceObjectByType(type);
- stack.push(obj);
- injectToParent(pObj,obj,name);
- }elseif(qName.equals(T_LANG)){
- //如果是lang则需要转化value值
- ObjectvalueObj=typeConvert(type,value);
- injectToParent(pObj,valueObj,name);
- }elseif(qName.equals(T_DATE)){
- //如果是date
- Stringpattern=attributes.getValue("pattern");
- if(pattern==null){
- pattern=D_PATTERN;
- }
- ObjectvalueObj=typeConvertDate(value,pattern);
- injectToParent(pObj,valueObj,name);
- }
- }
- //转化date类型
- privateDatetypeConvertDate(Stringvalue,Stringpattern){
- SimpleDateFormatsdf=newSimpleDateFormat(pattern);
- Datedate;
- try{
- date=sdf.parse(value);
- returndate;
- }catch(ParseExceptione){
- //TODOAuto-generatedcatchblock
- e.printStackTrace();
- }
- returnnull;
- }
- //向上一级元素中注入属性或者向集合类中add子元素
- privatevoidinjectToParent(ObjectpObj,ObjectfieldValue,StringfieldName){
- if(pObjinstanceofCollection){
- //如果上一级是集合类则需要添加进去
- ((Collection)pObj).add(fieldValue);
- return;
- }
- //如果上一级是object则需要反射字段赋值
- Field[]fields=pObj.getClass().getDeclaredFields();
- for(Fieldfield:fields){
- if(field.getName().equals(fieldName)){
- try{
- field.setAccessible(true);
- field.set(pObj,fieldValue);
- }catch(IllegalArgumentExceptione){
- //TODOAuto-generatedcatchblock
- e.printStackTrace();
- }catch(IllegalAccessExceptione){
- //TODOAuto-generatedcatchblock
- e.printStackTrace();
- }
- break;
- }
- }
- }
- //反射实例化对象
- privateObjectinstanceObjectByType(StringqName){
- try{
- ClasslocalClass=Class.forName(qName);
- Objectobj=localClass.getConstructor().newInstance();
- returnobj;
- }catch(Exceptione){
- //TODOAuto-generatedcatchblock
- e.printStackTrace();
- thrownewRuntimeException(e);
- }
- }
- //此方法用于将一个字符串转换为相应的数据类型
- publicObjecttypeConvert(StringclassName,Stringvalue){
- if(className.equals("java.lang.String")){
- returnvalue;
- }elseif(className.equals("java.lang.Integer")){
- returnInteger.valueOf(value);
- }elseif(className.equals("java.lang.Long")){
- returnLong.valueOf(value);
- }elseif(className.equals("java.lang.Boolean")){
- returnBoolean.valueOf(value);
- }elseif(className.equals("java.lang.Float")){
- returnFloat.valueOf(value);
- }elseif(className.equals("java.lang.Double")){
- returnDouble.valueOf(value);
- }else
- returnnull;
- }
- }
reflect.xml文件
Xml代码
- <?xmlversion="1.0"encoding="UTF-8"?>
- <collectontype="java.util.ArrayList">
- <objecttype="com.player.module.Resource">
- <langtype="java.lang.String"name="id"value="0001"></lang>
- <objecttype="com.player.module.Mp3"name="mp3">
- <langtype="java.lang.String"name="mp3Name"value="天地初开的时候.mp3"></lang>
- <langtype="java.lang.Integer"name="mp3Size"value="12333"></lang>
- </object>
- <objecttype="com.player.module.Lrc"name="lrc">
- <langtype="java.lang.String"name="lrcName"value="天地初开的时候.lrc"></lang>
- <langtype="java.lang.Integer"name="lrcSize"value="4312"></lang>
- </object>
- <datetype="java.util.Date"name="date"value="2001-12-1212:12:12"></date>
- </object>
- <objecttype="com.player.module.Resource">
- <langtype="java.lang.String"name="id"value="0002"></lang>
- <objecttype="com.player.module.Mp3"name="mp3">
- <langtype="java.lang.String"name="mp3Name"value="那一曲盛放的玫瑰.mp3"></lang>
- <langtype="java.lang.Integer"name="mp3Size"value="12333"></lang>
- </object>
- <objecttype="com.player.module.Lrc"name="lrc">
- <langtype="java.lang.String"name="lrcName"value="那一曲盛放的玫瑰.lrc"></lang>
- <langtype="java.lang.Integer"name="lrcSize"value="4312"></lang>
- </object>
- <datetype="java.util.Date"name="date"value="2001-12-1312:12:12"></date>
- </object>
- </collecton>
HandleTest.java
Java代码
- packagecom.player.handle;
- importjava.io.File;
- importjava.io.IOException;
- importjava.util.List;
- importjavax.xml.parsers.ParserConfigurationException;
- importjavax.xml.parsers.SAXParser;
- importjavax.xml.parsers.SAXParserFactory;
- importorg.junit.Test;
- importorg.xml.sax.SAXException;
- importcom.player.module.Resource;
- publicclassHandleTest{
- @Test
- publicvoidtestresolveXmlTest()throwsParserConfigurationException,SAXException,IOException{
- //HttpDownloaderdownloader=newHttpDownloader();
- //Stringxml=downloader.download(Mp3ListActiviy.URL);
- Filefile=newjava.io.File("D:\\Soft\\Program\\Apache-Tomcat-6.0.20\\webapps\\android_mp3\\reflect.xml");
- SAXParsersaxParser=SAXParserFactory.newInstance().newSAXParser();
- ReflectResolveXMLreflectResolveXML=newReflectResolveXML();
- saxParser.parse(file,reflectResolveXML);
- List<Resource>resources=(List<Resource>)reflectResolveXML.getRoot();
- System.out.println("---------------------");
- for(Resourceresource:resources){
- System.out.println(resource.toString());
- }
- //mp3xmlHandle.getMp3List();
- }
- }
三个javabean
Java代码
- publicclassLrc{
- privateStringlrcName;
- privateIntegerlrcSize;
- }
- publicclassMp3{
- privateStringmp3Name;
- privateintmp3Size;
- }
- publicclassResource{
- privateStringid;
- privateMp3mp3;
- privateLrclrc;
- privateDatedate;
- }
更多相关文章
- android典型代码系列(三十)------DES加密算法
- 使用 Android NDK 重用现有的 C 代码
- 修改Android的开关机铃声、Android开关机画面与动画(附代码流程)
- Android 初学入门代码注释 学习笔记001 16.03.18
- Android实训所学功能实现代码集合
- Android自动更新代码
- android代码实现自动关机