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

附件:http://down.51cto.com/data/2360816

本文转自winorlose2000 51CTO博客,原文链接:http://blog.51cto.com/vaero/900852,如需转载请自行联系原作者

Android XML小工具相关推荐

  1. Android应用小工具(窗口小部件)

    Widget是可以在其他应用程序被嵌入和接收定期更新的微型应用程序视图. 在创建一个应用程序窗口小部件,需要满足以下条件: AppWidgetProviderInfo--描述元数据为应用窗口小部件,如 ...

  2. android 开发小工具,Android 开发者必备的八款小工具

    在做Android 开发过程中,会遇到一些小的问题,虽然自己动手也能解决,但是有了一些小工具,解决这些问题就得心应手了,今天就为大家推荐一些Android 开发必备的小工具. Android Pixe ...

  3. android倒计时小工具,为五一放假倒计时《倒数日小工具》

    俗话说好记性不如烂笔头,有时候记到脑子里并不一定是最保险,因为它总有短路和不灵光的时候,当你忘记精彩的球赛.周年纪念日.生日等重要时刻的时候,再拍着脑袋追悔莫及就为时已晚了.装上这款Android&l ...

  4. Android 性能测试小工具 Emmagee

    Emmagee 是一个性能测试小工具 用来监控指定被测应用在使用过程中占用机器的CPU, 内存,流量资源的性能小工具 Emmagee 介绍 Emmagee是网易杭州研究院QA团队开发的一个简单易上手的 ...

  5. Android 开发小工具之:Custom Tabs

    上周 Android Support 库偷偷摸摸更新了,里面多了几个小工具.今天来看看其中之一: Custom Tabs . 注意这个指的是 Chrome 浏览器的自定义多窗口 的意思而不是指 And ...

  6. Android 性能测试小工具 (cpu,内存,电量,流量数据浮窗显示,信息导入数据库、sd卡)

    [mie haha的博客]转载请注明出处(万分感谢!): https://blog.csdn.net/qq_40315080/article/details/98610748 写一个测试各个app/手 ...

  7. android 常用注解,Android 开发小工具之:注解 Annotation

    Android Support 包之一的 support-annotations是通过静态编译检测来提高代码质量的一个注解工具.里面包含了 Android 开发中常用的代码检测注解,帮助开发者提高代码 ...

  8. android xml 小圆点,如何在android xml可绘制文件中定义一个圆形状?

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 我有一些问题找到Android的XML的形状定义的文档.我想在XML文件中定义一个简单的填充了纯色的圆圈,将其包含到我的 ...

  9. android xml ignore,工具:ignore =“UselessParent”是什么意思在Android XML布局文件中?...

    在你的情况 tools:ignore="UselessParent" 告诉你的IDE,以避免显示如下消息:"这RelativeLayout的布局或它的LinearLayo ...

最新文章

  1. axure 下拉多选 元件_Axure教程:下拉多选列表集合(多选下拉列表+单选下拉列表+分级下拉列表)...
  2. 第五次作业——软件设计
  3. window mysql proxy_window下mysql-proxy简单使用
  4. 腾讯课堂的物理实验(2017计蒜客初赛第三场)
  5. IE6PNG8PNG24test
  6. 第2章[2.6] 组件与容器的选择与开发
  7. 给Bert加速吧!NLP中的知识蒸馏Distilled BiLSTM论文解读
  8. RN上使用react-native-video视频播放器插件
  9. fusioncharts的打印管理(printManager)
  10. ceph 集群报 mds cluster is degraded 故障排查
  11. Scoks5 一键搭建脚本,解决nolanjdc被限制IP
  12. 塑料粘结硬质铁氧体磁铁的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  13. 3D模型欣赏:永恒之王异形机甲风
  14. java json设置编码_java-JSON字符编码
  15. 惠普电脑win10关闭自动调节亮度
  16. nginx某条日志详解
  17. 高斯模糊与图像失焦,附Python代码实现
  18. mahout fpg
  19. USB 3G上网卡讲解之一
  20. python 使用随笔

热门文章

  1. JAVA黑白圆圈图形_CSS3 黑白交替旋转圆圈
  2. 服务化改造实践 | 如何在 Dubbo 中支持 REST
  3. 搭建“双11”大型网站架构必须掌握的 5 个核心知识
  4. 给你30秒的时间,你会用Excel制作出一个抽奖功能吗?
  5. 【Java并发编程】—–“J.U.C”:ConcurrentLinkedQueue
  6. ThinkPHP 3.2.2 在 volist 多重循环嵌套中使用 if 判断标签
  7. python魔法方法详解
  8. 大数据多属性的数据架构设计
  9. C#抽象类和抽象方法的特征和用途
  10. python的scramy架构_Python库: PrettyTable 模块