AndroidXML小工具 一、概述 XML与Object互相转化,支持8种基本类型、String和byte[]。byte[]需要经由base64编码(API8以后才有,之前版本可以自己拷入)。 更多代码及测试用例,见附件工程! 二、Object–>XML
        
  1. publicclassXmlBuilder{
  2. /**
  3. *由对象属性生成XML
  4. *
  5. *@paramouts输出流
  6. *@paramencoding字符编码
  7. *@paramobj对象
  8. */
  9. publicvoidbuildXml(OutputStreamouts,Stringencoding,Objectobj)
  10. throwsIllegalArgumentException,IllegalStateException,
  11. IOException,IllegalAccessException{
  12. XmlSerializerserializer=Xml.newSerializer();//创建一个Xml序列化
  13. serializer.setOutput(outs,encoding);//设置输出流及字符编码
  14. serializer.startDocument(encoding,true);//开始文档
  15. writeXml(serializer,obj);//写文档
  16. serializer.endDocument();//结束文档
  17. outs.close();//关闭输出流
  18. }
  19. /**
  20. *将对象属性写入XML
  21. *
  22. *@paramserializerXML序列化
  23. *@paramobj对象
  24. */
  25. privatevoidwriteXml(XmlSerializerserializer,Objectobj)
  26. throwsIllegalArgumentException,IllegalStateException,
  27. IOException,IllegalAccessException{
  28. finalStringtag_type="type";
  29. finalStringtag_value="value";
  30. Class<?>cls=obj.getClass();//获取对象运行时类
  31. StringclsName=cls.getName();//获取对象名称
  32. serializer.startTag(null,clsName);
  33. Field[]fields=cls.getDeclaredFields();//返回类声明的所有字段
  34. booleanisWrite;
  35. Class<?>type;//变量类型
  36. StringvarName,typeName,value=null;//变量名、类型名、变量值
  37. for(Fieldfield:fields){
  38. isWrite=true;
  39. type=field.getType();//获取变量类型
  40. typeName=type.getName();//获取类型名
  41. field.setAccessible(true);//设置变量可访问
  42. if(type.isPrimitive()){//是否为基本类型
  43. if(typeName.equals("boolean")){
  44. value=String.valueOf(field.getBoolean(obj));
  45. }elseif(typeName.equals("char")){
  46. //char型未赋值,为默认'\u0000'时,会影响parser.next()
  47. charc=field.getChar(obj);
  48. value=c=='\u0000'?"null":String.valueOf(field
  49. .getChar(obj));
  50. }elseif(typeName.equals("byte")){
  51. value=String.valueOf(field.getByte(obj));
  52. }elseif(typeName.equals("short")){
  53. value=String.valueOf(field.getShort(obj));
  54. }elseif(typeName.equals("int")){
  55. value=String.valueOf(field.getInt(obj));
  56. }elseif(typeName.equals("long")){
  57. value=String.valueOf(field.getLong(obj));
  58. }elseif(typeName.equals("float")){
  59. value=String.valueOf(field.getFloat(obj));
  60. }elseif(typeName.equals("double")){
  61. value=String.valueOf(field.getDouble(obj));
  62. }
  63. }elseif(typeName.equals("java.lang.String")){//是否为String
  64. value=field.get(obj)==null?"null":field.get(obj)
  65. .toString();
  66. }elseif(typeName.equals("[B")){//是否为byte[]
  67. typeName=getTypeHelper(type);//字符代码->[]形式
  68. //用Base64将byte[]转成字符串(SDK2.2之后自带)
  69. value=field.get(obj)==null?"null"
  70. :Base64.encodeToString((byte[])field.get(obj),
  71. Base64.DEFAULT);
  72. }else{//其他类型暂不需要
  73. isWrite=false;
  74. }
  75. if(isWrite){
  76. varName=field.getName();//获取变量名
  77. serializer.startTag(null,varName);
  78. writeTag(serializer,tag_type,typeName);
  79. writeTag(serializer,tag_value,value);
  80. serializer.endTag(null,varName);
  81. }
  82. }
  83. serializer.endTag(null,clsName);
  84. }
  85. /**
  86. *字符代码->[]形式
  87. */
  88. privateStringgetTypeHelper(Class<?>type){
  89. if(type.isArray()){
  90. Class<?>c=type.getComponentType();
  91. returngetTypeHelper(c)+"[]";
  92. }else{
  93. returntype.getName();
  94. }
  95. }
  96. /**
  97. *写一个标签及值
  98. */
  99. privatevoidwriteTag(XmlSerializerserializer,Stringtag,Stringvalue)
  100. throwsIllegalArgumentException,IllegalStateException,IOException{
  101. serializer.startTag(null,tag);
  102. serializer.text(value);
  103. serializer.endTag(null,tag);
  104. }
  105. }
三、XML->Object
        
  1. publicclassXmlParser{
  2. /**
  3. *分析XML将对应值赋予对象
  4. *
  5. *@paramins输入流
  6. *@paramencoding字符编码
  7. *@paramobj对象
  8. */
  9. publicvoidparseXml(InputStreamins,Stringencoding,Objectobj)
  10. throwsXmlPullParserException,IllegalArgumentException,
  11. UnsupportedEncodingException,IllegalAccessException,IOException{
  12. XmlPullParserparser=Xml.newPullParser();//创建一个Xml分析器
  13. parser.setInput(ins,encoding);//设置输入流及字符编码
  14. parseXml(parser,obj);//解析文档
  15. ins.close();//关闭输入流
  16. }
  17. /**
  18. *分析XML详细步骤
  19. *
  20. *@paramparserXml分析器
  21. *@paramobj对象
  22. */
  23. privatevoidparseXml(XmlPullParserparser,Objectobj)
  24. throwsXmlPullParserException,IllegalArgumentException,
  25. UnsupportedEncodingException,IllegalAccessException,IOException{
  26. finalStringtag_value="value";
  27. Class<?>cls=obj.getClass();//获取对象运行时类
  28. StringclsName=cls.getName();//获取对象名称
  29. Field[]fields=cls.getDeclaredFields();//返回类声明的所有字段
  30. Fieldfield=null;
  31. inttagDepth;//标签深度
  32. StringtagName;//标签名称
  33. inteventType=parser.getEventType();//获取事件类型
  34. while(true){
  35. if(eventType==XmlPullParser.START_DOCUMENT){
  36. //Log.i("START_DOCUMENT","=START_DOCUMENT");
  37. }elseif(eventType==XmlPullParser.START_TAG){
  38. //Log.i("START_TAG","=START_TAG");
  39. tagDepth=parser.getDepth();//获取标签深度
  40. tagName=parser.getName();//获取标签名称
  41. if(tagDepth==1){//一级标签
  42. if(!tagName.equals(clsName)){//与对象名称不一致时
  43. thrownewXmlPullParserException("XML首标签名与对象名称不一致");
  44. }
  45. }elseif(tagDepth==2){//二级标签
  46. //判断标签名称是否符合类的某一字段名称
  47. field=hasField(tagName,fields);
  48. }elseif(tagDepth==3&&field!=null){//三级标签
  49. if(tagName.equals(tag_value)){//如果是value标签
  50. setValue(obj,field,parser.nextText());
  51. field=null;
  52. }
  53. }
  54. }elseif(eventType==XmlPullParser.END_TAG){
  55. //Log.i("END_TAG","=END_TAG");
  56. }elseif(eventType==XmlPullParser.TEXT){
  57. //Log.i("TEXT","=TEXT");
  58. }elseif(eventType==XmlPullParser.END_DOCUMENT){
  59. //Log.i("END_DOCUMENT","=END_DOCUMENT");
  60. break;
  61. }
  62. eventType=parser.next();//下一解析事件
  63. }
  64. }
  65. /**
  66. *判断标签名称是否符合类的某一字段名称
  67. *
  68. *@paramtagName标签名称
  69. *@paramfields类字段集合
  70. *@return符合:Field;否则:null
  71. */
  72. privateFieldhasField(StringtagName,Field[]fields){
  73. for(Fieldfield:fields){
  74. if(tagName.equals(field.getName())){
  75. returnfield;
  76. }
  77. }
  78. returnnull;
  79. }
  80. /**
  81. *给字段设值
  82. *
  83. *@paramobj对象
  84. *@paramfield字段
  85. *@paramvalue值
  86. */
  87. privatevoidsetValue(Objectobj,Fieldfield,Stringvalue)
  88. throwsIllegalArgumentException,IllegalAccessException,
  89. UnsupportedEncodingException{
  90. Class<?>type=field.getType();//变量类型
  91. StringtypeName=type.getName();//类型名
  92. field.setAccessible(true);//设置变量可访问
  93. if(type.isPrimitive()){//是否为基本类型
  94. if(typeName.equals("boolean")){
  95. field.setBoolean(obj,Boolean.parseBoolean(value));
  96. }elseif(typeName.equals("char")){
  97. if(!value.equals("null")){
  98. field.setChar(obj,value.charAt(0));
  99. }
  100. }elseif(typeName.equals("byte")){
  101. field.setByte(obj,Byte.parseByte(value));
  102. }elseif(typeName.equals("short")){
  103. field.setShort(obj,Short.parseShort(value));
  104. }elseif(typeName.equals("int")){
  105. field.setInt(obj,Integer.parseInt(value));
  106. }elseif(typeName.equals("long")){
  107. field.setLong(obj,Long.parseLong(value));
  108. }elseif(typeName.equals("float")){
  109. field.setFloat(obj,Float.parseFloat(value));
  110. }elseif(typeName.equals("double")){
  111. field.setDouble(obj,Double.parseDouble(value));
  112. }
  113. }elseif(typeName.equals("java.lang.String")){//是否为String
  114. if(!value.equals("null")){
  115. field.set(obj,value);
  116. }
  117. }elseif(typeName.equals("[B")){//是否为byte[]
  118. if(!value.equals("null")){
  119. //用Base64将字符串转成byte[](SDK2.2之后自带)
  120. field.set(obj,Base64.decode(value,Base64.DEFAULT));
  121. }
  122. }//其他类型暂不需要
  123. }
  124. }
四、后记 Json与Object互相转化,可看《 Android实时绘制效果》附件工程内的JsonUtil。

更多相关文章

  1. Android资源类型、结构、使用
  2. [Android]attrs.xml文件中属性类型format值的格式
  3. android bundle 对象 序列化
  4. 用kotlin打印出漂亮的android日志(三)——基于责任链模式打印任
  5. android 布局文件中控件ID、name标签属性的命名包含“@”、“.”
  6. Android时间获取之——Date、String、Long三种日期类型之间的相
  7. Android简单类型资源(Bool、Color、Dimension、ID、Integer、Inte
  8. android activity之间传递bean类型数据
  9. android实现Parcelable序列化对象

随机推荐

  1. android adb pm命令
  2. Android(安卓)activity 参数传递
  3. SOAP in Android
  4. android异常 More than one file was fou
  5. Android: 打印Bundle内容
  6. 一分钟解决Android(安卓)安卓 API版本兼
  7. android 根据res文件夹下(如res/raw)文件
  8. ReactNative调用原生封装的代码和控件
  9. Android(安卓)4.0 中的Camera
  10. Android(安卓)5种方式存储数据: