Android XML小工具
16lz
2021-01-23
AndroidXML小工具 一、概述 XML与Object互相转化,支持8种基本类型、String和byte[]。byte[]需要经由base64编码(API8以后才有,之前版本可以自己拷入)。 更多代码及测试用例,见附件工程! 二、Object–>XML
三、XML->Object
- publicclassXmlBuilder{
- /**
- *由对象属性生成XML
- *
- *@paramouts输出流
- *@paramencoding字符编码
- *@paramobj对象
- */
- publicvoidbuildXml(OutputStreamouts,Stringencoding,Objectobj)
- throwsIllegalArgumentException,IllegalStateException,
- IOException,IllegalAccessException{
- XmlSerializerserializer=Xml.newSerializer();//创建一个Xml序列化
- serializer.setOutput(outs,encoding);//设置输出流及字符编码
- serializer.startDocument(encoding,true);//开始文档
- writeXml(serializer,obj);//写文档
- serializer.endDocument();//结束文档
- outs.close();//关闭输出流
- }
- /**
- *将对象属性写入XML
- *
- *@paramserializerXML序列化
- *@paramobj对象
- */
- privatevoidwriteXml(XmlSerializerserializer,Objectobj)
- throwsIllegalArgumentException,IllegalStateException,
- IOException,IllegalAccessException{
- finalStringtag_type="type";
- finalStringtag_value="value";
- Class<?>cls=obj.getClass();//获取对象运行时类
- StringclsName=cls.getName();//获取对象名称
- serializer.startTag(null,clsName);
- Field[]fields=cls.getDeclaredFields();//返回类声明的所有字段
- booleanisWrite;
- Class<?>type;//变量类型
- StringvarName,typeName,value=null;//变量名、类型名、变量值
- for(Fieldfield:fields){
- isWrite=true;
- type=field.getType();//获取变量类型
- typeName=type.getName();//获取类型名
- field.setAccessible(true);//设置变量可访问
- if(type.isPrimitive()){//是否为基本类型
- if(typeName.equals("boolean")){
- value=String.valueOf(field.getBoolean(obj));
- }elseif(typeName.equals("char")){
- //char型未赋值,为默认'\u0000'时,会影响parser.next()
- charc=field.getChar(obj);
- value=c=='\u0000'?"null":String.valueOf(field
- .getChar(obj));
- }elseif(typeName.equals("byte")){
- value=String.valueOf(field.getByte(obj));
- }elseif(typeName.equals("short")){
- value=String.valueOf(field.getShort(obj));
- }elseif(typeName.equals("int")){
- value=String.valueOf(field.getInt(obj));
- }elseif(typeName.equals("long")){
- value=String.valueOf(field.getLong(obj));
- }elseif(typeName.equals("float")){
- value=String.valueOf(field.getFloat(obj));
- }elseif(typeName.equals("double")){
- value=String.valueOf(field.getDouble(obj));
- }
- }elseif(typeName.equals("java.lang.String")){//是否为String
- value=field.get(obj)==null?"null":field.get(obj)
- .toString();
- }elseif(typeName.equals("[B")){//是否为byte[]
- typeName=getTypeHelper(type);//字符代码->[]形式
- //用Base64将byte[]转成字符串(SDK2.2之后自带)
- value=field.get(obj)==null?"null"
- :Base64.encodeToString((byte[])field.get(obj),
- Base64.DEFAULT);
- }else{//其他类型暂不需要
- isWrite=false;
- }
- if(isWrite){
- varName=field.getName();//获取变量名
- serializer.startTag(null,varName);
- writeTag(serializer,tag_type,typeName);
- writeTag(serializer,tag_value,value);
- serializer.endTag(null,varName);
- }
- }
- serializer.endTag(null,clsName);
- }
- /**
- *字符代码->[]形式
- */
- privateStringgetTypeHelper(Class<?>type){
- if(type.isArray()){
- Class<?>c=type.getComponentType();
- returngetTypeHelper(c)+"[]";
- }else{
- returntype.getName();
- }
- }
- /**
- *写一个标签及值
- */
- privatevoidwriteTag(XmlSerializerserializer,Stringtag,Stringvalue)
- throwsIllegalArgumentException,IllegalStateException,IOException{
- serializer.startTag(null,tag);
- serializer.text(value);
- serializer.endTag(null,tag);
- }
- }
四、后记 Json与Object互相转化,可看《 Android实时绘制效果》附件工程内的JsonUtil。
- publicclassXmlParser{
- /**
- *分析XML将对应值赋予对象
- *
- *@paramins输入流
- *@paramencoding字符编码
- *@paramobj对象
- */
- publicvoidparseXml(InputStreamins,Stringencoding,Objectobj)
- throwsXmlPullParserException,IllegalArgumentException,
- UnsupportedEncodingException,IllegalAccessException,IOException{
- XmlPullParserparser=Xml.newPullParser();//创建一个Xml分析器
- parser.setInput(ins,encoding);//设置输入流及字符编码
- parseXml(parser,obj);//解析文档
- ins.close();//关闭输入流
- }
- /**
- *分析XML详细步骤
- *
- *@paramparserXml分析器
- *@paramobj对象
- */
- privatevoidparseXml(XmlPullParserparser,Objectobj)
- throwsXmlPullParserException,IllegalArgumentException,
- UnsupportedEncodingException,IllegalAccessException,IOException{
- finalStringtag_value="value";
- Class<?>cls=obj.getClass();//获取对象运行时类
- StringclsName=cls.getName();//获取对象名称
- Field[]fields=cls.getDeclaredFields();//返回类声明的所有字段
- Fieldfield=null;
- inttagDepth;//标签深度
- StringtagName;//标签名称
- inteventType=parser.getEventType();//获取事件类型
- while(true){
- if(eventType==XmlPullParser.START_DOCUMENT){
- //Log.i("START_DOCUMENT","=START_DOCUMENT");
- }elseif(eventType==XmlPullParser.START_TAG){
- //Log.i("START_TAG","=START_TAG");
- tagDepth=parser.getDepth();//获取标签深度
- tagName=parser.getName();//获取标签名称
- if(tagDepth==1){//一级标签
- if(!tagName.equals(clsName)){//与对象名称不一致时
- thrownewXmlPullParserException("XML首标签名与对象名称不一致");
- }
- }elseif(tagDepth==2){//二级标签
- //判断标签名称是否符合类的某一字段名称
- field=hasField(tagName,fields);
- }elseif(tagDepth==3&&field!=null){//三级标签
- if(tagName.equals(tag_value)){//如果是value标签
- setValue(obj,field,parser.nextText());
- field=null;
- }
- }
- }elseif(eventType==XmlPullParser.END_TAG){
- //Log.i("END_TAG","=END_TAG");
- }elseif(eventType==XmlPullParser.TEXT){
- //Log.i("TEXT","=TEXT");
- }elseif(eventType==XmlPullParser.END_DOCUMENT){
- //Log.i("END_DOCUMENT","=END_DOCUMENT");
- break;
- }
- eventType=parser.next();//下一解析事件
- }
- }
- /**
- *判断标签名称是否符合类的某一字段名称
- *
- *@paramtagName标签名称
- *@paramfields类字段集合
- *@return符合:Field;否则:null
- */
- privateFieldhasField(StringtagName,Field[]fields){
- for(Fieldfield:fields){
- if(tagName.equals(field.getName())){
- returnfield;
- }
- }
- returnnull;
- }
- /**
- *给字段设值
- *
- *@paramobj对象
- *@paramfield字段
- *@paramvalue值
- */
- privatevoidsetValue(Objectobj,Fieldfield,Stringvalue)
- throwsIllegalArgumentException,IllegalAccessException,
- UnsupportedEncodingException{
- Class<?>type=field.getType();//变量类型
- StringtypeName=type.getName();//类型名
- field.setAccessible(true);//设置变量可访问
- if(type.isPrimitive()){//是否为基本类型
- if(typeName.equals("boolean")){
- field.setBoolean(obj,Boolean.parseBoolean(value));
- }elseif(typeName.equals("char")){
- if(!value.equals("null")){
- field.setChar(obj,value.charAt(0));
- }
- }elseif(typeName.equals("byte")){
- field.setByte(obj,Byte.parseByte(value));
- }elseif(typeName.equals("short")){
- field.setShort(obj,Short.parseShort(value));
- }elseif(typeName.equals("int")){
- field.setInt(obj,Integer.parseInt(value));
- }elseif(typeName.equals("long")){
- field.setLong(obj,Long.parseLong(value));
- }elseif(typeName.equals("float")){
- field.setFloat(obj,Float.parseFloat(value));
- }elseif(typeName.equals("double")){
- field.setDouble(obj,Double.parseDouble(value));
- }
- }elseif(typeName.equals("java.lang.String")){//是否为String
- if(!value.equals("null")){
- field.set(obj,value);
- }
- }elseif(typeName.equals("[B")){//是否为byte[]
- if(!value.equals("null")){
- //用Base64将字符串转成byte[](SDK2.2之后自带)
- field.set(obj,Base64.decode(value,Base64.DEFAULT));
- }
- }//其他类型暂不需要
- }
- }
更多相关文章
- Android资源类型、结构、使用
- [Android]attrs.xml文件中属性类型format值的格式
- android bundle 对象 序列化
- 用kotlin打印出漂亮的android日志(三)——基于责任链模式打印任
- android 布局文件中控件ID、name标签属性的命名包含“@”、“.”
- Android时间获取之——Date、String、Long三种日期类型之间的相
- Android简单类型资源(Bool、Color、Dimension、ID、Integer、Inte
- android activity之间传递bean类型数据
- android实现Parcelable序列化对象