Android XML小工具
- public class XmlBuilder {
- /**
- * 由对象属性生成XML
- *
- * @param outs 输出流
- * @param encoding 字符编码
- * @param obj 对象
- */
- public void buildXml(OutputStream outs, String encoding, Object obj)
- throws IllegalArgumentException, IllegalStateException,
- IOException, IllegalAccessException {
- XmlSerializer serializer = Xml.newSerializer(); // 创建一个Xml序列化
- serializer.setOutput(outs, encoding); // 设置输出流及字符编码
- serializer.startDocument(encoding, true); // 开始文档
- writeXml(serializer, obj); // 写文档
- serializer.endDocument(); // 结束文档
- outs.close(); // 关闭输出流
- }
- /**
- * 将对象属性写入XML
- *
- * @param serializer XML序列化
- * @param obj 对象
- */
- private void writeXml(XmlSerializer serializer, Object obj)
- throws IllegalArgumentException, IllegalStateException,
- IOException, IllegalAccessException {
- final String tag_type = "type";
- final String tag_value = "value";
- Class<?> cls = obj.getClass(); // 获取对象运行时类
- String clsName = cls.getName(); // 获取对象名称
- serializer.startTag(null, clsName);
- Field[] fields = cls.getDeclaredFields(); // 返回类声明的所有字段
- boolean isWrite;
- Class<?> type; // 变量类型
- String varName, typeName, value = null; // 变量名、类型名、变量值
- for (Field field : 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));
- } else if (typeName.equals("char")) {
- // char型未赋值,为默认'\u0000'时,会影响parser.next()
- char c = field.getChar(obj);
- value = c == '\u0000' ? "null" : String.valueOf(field
- .getChar(obj));
- } else if (typeName.equals("byte")) {
- value = String.valueOf(field.getByte(obj));
- } else if (typeName.equals("short")) {
- value = String.valueOf(field.getShort(obj));
- } else if (typeName.equals("int")) {
- value = String.valueOf(field.getInt(obj));
- } else if (typeName.equals("long")) {
- value = String.valueOf(field.getLong(obj));
- } else if (typeName.equals("float")) {
- value = String.valueOf(field.getFloat(obj));
- } else if (typeName.equals("double")) {
- value = String.valueOf(field.getDouble(obj));
- }
- } else if (typeName.equals("java.lang.String")) { // 是否为String
- value = field.get(obj) == null ? "null" : field.get(obj)
- .toString();
- } else if (typeName.equals("[B")) { // 是否为byte[]
- typeName = getTypeHelper(type); // 字符代码->[]形式
- // 用Base64将byte[]转成字符串(SDK 2.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);
- }
- /**
- * 字符代码->[]形式
- */
- private String getTypeHelper(Class<?> type) {
- if (type.isArray()) {
- Class<?> c = type.getComponentType();
- return getTypeHelper(c) + "[]";
- } else {
- return type.getName();
- }
- }
- /**
- * 写一个标签及值
- */
- private void writeTag(XmlSerializer serializer, String tag, String value)
- throws IllegalArgumentException, IllegalStateException, IOException {
- serializer.startTag(null, tag);
- serializer.text(value);
- serializer.endTag(null, tag);
- }
- }
- public class XmlParser {
- /**
- * 分析XML将对应值赋予对象
- *
- * @param ins 输入流
- * @param encoding 字符编码
- * @param obj 对象
- */
- public void parseXml(InputStream ins, String encoding, Object obj)
- throws XmlPullParserException, IllegalArgumentException,
- UnsupportedEncodingException, IllegalAccessException, IOException {
- XmlPullParser parser = Xml.newPullParser(); // 创建一个Xml分析器
- parser.setInput(ins, encoding); // 设置输入流及字符编码
- parseXml(parser, obj); // 解析文档
- ins.close(); // 关闭输入流
- }
- /**
- * 分析XML详细步骤
- *
- * @param parser Xml分析器
- * @param obj 对象
- */
- private void parseXml(XmlPullParser parser, Object obj)
- throws XmlPullParserException, IllegalArgumentException,
- UnsupportedEncodingException, IllegalAccessException, IOException {
- final String tag_value = "value";
- Class<?> cls = obj.getClass(); // 获取对象运行时类
- String clsName = cls.getName(); // 获取对象名称
- Field[] fields = cls.getDeclaredFields(); // 返回类声明的所有字段
- Field field = null;
- int tagDepth; // 标签深度
- String tagName; // 标签名称
- int eventType = parser.getEventType(); // 获取事件类型
- while (true) {
- if (eventType == XmlPullParser.START_DOCUMENT) {
- // Log.i("START_DOCUMENT", "=START_DOCUMENT");
- } else if (eventType == XmlPullParser.START_TAG) {
- // Log.i("START_TAG", "=START_TAG");
- tagDepth = parser.getDepth(); // 获取标签深度
- tagName = parser.getName(); // 获取标签名称
- if (tagDepth == 1) { // 一级标签
- if (!tagName.equals(clsName)) { // 与对象名称不一致时
- throw new XmlPullParserException("XML首标签名与对象名称不一致");
- }
- } else if (tagDepth == 2) { // 二级标签
- // 判断标签名称是否符合类的某一字段名称
- field = hasField(tagName, fields);
- } else if (tagDepth == 3 && field != null) { // 三级标签
- if (tagName.equals(tag_value)) { // 如果是value标签
- setValue(obj, field, parser.nextText());
- field = null;
- }
- }
- } else if (eventType == XmlPullParser.END_TAG) {
- // Log.i("END_TAG", "=END_TAG");
- } else if (eventType == XmlPullParser.TEXT) {
- // Log.i("TEXT", "=TEXT");
- } else if (eventType == XmlPullParser.END_DOCUMENT) {
- // Log.i("END_DOCUMENT", "=END_DOCUMENT");
- break;
- }
- eventType = parser.next(); // 下一解析事件
- }
- }
- /**
- * 判断标签名称是否符合类的某一字段名称
- *
- * @param tagName 标签名称
- * @param fields 类字段集合
- * @return 符合:Field;否则:null
- */
- private Field hasField(String tagName, Field[] fields) {
- for (Field field : fields) {
- if (tagName.equals(field.getName())) {
- return field;
- }
- }
- return null;
- }
- /**
- * 给字段设值
- *
- * @param obj 对象
- * @param field 字段
- * @param value 值
- */
- private void setValue(Object obj, Field field, String value)
- throws IllegalArgumentException, IllegalAccessException,
- UnsupportedEncodingException {
- Class<?> type = field.getType(); // 变量类型
- String typeName = type.getName(); // 类型名
- field.setAccessible(true); // 设置变量可访问
- if (type.isPrimitive()) { // 是否为基本类型
- if (typeName.equals("boolean")) {
- field.setBoolean(obj, Boolean.parseBoolean(value));
- } else if (typeName.equals("char")) {
- if (!value.equals("null")) {
- field.setChar(obj, value.charAt(0));
- }
- } else if (typeName.equals("byte")) {
- field.setByte(obj, Byte.parseByte(value));
- } else if (typeName.equals("short")) {
- field.setShort(obj, Short.parseShort(value));
- } else if (typeName.equals("int")) {
- field.setInt(obj, Integer.parseInt(value));
- } else if (typeName.equals("long")) {
- field.setLong(obj, Long.parseLong(value));
- } else if (typeName.equals("float")) {
- field.setFloat(obj, Float.parseFloat(value));
- } else if (typeName.equals("double")) {
- field.setDouble(obj, Double.parseDouble(value));
- }
- } else if (typeName.equals("java.lang.String")) { // 是否为String
- if (!value.equals("null")) {
- field.set(obj, value);
- }
- } else if (typeName.equals("[B")) { // 是否为byte[]
- if (!value.equals("null")) {
- // 用Base64将字符串转成byte[](SDK 2.2之后自带)
- field.set(obj, Base64.decode(value, Base64.DEFAULT));
- }
- } // 其他类型暂不需要
- }
- }
附件:http://down.51cto.com/data/2360816
本文转自winorlose2000 51CTO博客,原文链接:http://blog.51cto.com/vaero/900852,如需转载请自行联系原作者
Android XML小工具相关推荐
- Android应用小工具(窗口小部件)
Widget是可以在其他应用程序被嵌入和接收定期更新的微型应用程序视图. 在创建一个应用程序窗口小部件,需要满足以下条件: AppWidgetProviderInfo--描述元数据为应用窗口小部件,如 ...
- android 开发小工具,Android 开发者必备的八款小工具
在做Android 开发过程中,会遇到一些小的问题,虽然自己动手也能解决,但是有了一些小工具,解决这些问题就得心应手了,今天就为大家推荐一些Android 开发必备的小工具. Android Pixe ...
- android倒计时小工具,为五一放假倒计时《倒数日小工具》
俗话说好记性不如烂笔头,有时候记到脑子里并不一定是最保险,因为它总有短路和不灵光的时候,当你忘记精彩的球赛.周年纪念日.生日等重要时刻的时候,再拍着脑袋追悔莫及就为时已晚了.装上这款Android&l ...
- Android 性能测试小工具 Emmagee
Emmagee 是一个性能测试小工具 用来监控指定被测应用在使用过程中占用机器的CPU, 内存,流量资源的性能小工具 Emmagee 介绍 Emmagee是网易杭州研究院QA团队开发的一个简单易上手的 ...
- Android 开发小工具之:Custom Tabs
上周 Android Support 库偷偷摸摸更新了,里面多了几个小工具.今天来看看其中之一: Custom Tabs . 注意这个指的是 Chrome 浏览器的自定义多窗口 的意思而不是指 And ...
- Android 性能测试小工具 (cpu,内存,电量,流量数据浮窗显示,信息导入数据库、sd卡)
[mie haha的博客]转载请注明出处(万分感谢!): https://blog.csdn.net/qq_40315080/article/details/98610748 写一个测试各个app/手 ...
- android 常用注解,Android 开发小工具之:注解 Annotation
Android Support 包之一的 support-annotations是通过静态编译检测来提高代码质量的一个注解工具.里面包含了 Android 开发中常用的代码检测注解,帮助开发者提高代码 ...
- android xml 小圆点,如何在android xml可绘制文件中定义一个圆形状?
8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 我有一些问题找到Android的XML的形状定义的文档.我想在XML文件中定义一个简单的填充了纯色的圆圈,将其包含到我的 ...
- android xml ignore,工具:ignore =“UselessParent”是什么意思在Android XML布局文件中?...
在你的情况 tools:ignore="UselessParent" 告诉你的IDE,以避免显示如下消息:"这RelativeLayout的布局或它的LinearLayo ...
最新文章
- axure 下拉多选 元件_Axure教程:下拉多选列表集合(多选下拉列表+单选下拉列表+分级下拉列表)...
- 第五次作业——软件设计
- window mysql proxy_window下mysql-proxy简单使用
- 腾讯课堂的物理实验(2017计蒜客初赛第三场)
- IE6PNG8PNG24test
- 第2章[2.6] 组件与容器的选择与开发
- 给Bert加速吧!NLP中的知识蒸馏Distilled BiLSTM论文解读
- RN上使用react-native-video视频播放器插件
- fusioncharts的打印管理(printManager)
- ceph 集群报 mds cluster is degraded 故障排查
- Scoks5 一键搭建脚本,解决nolanjdc被限制IP
- 塑料粘结硬质铁氧体磁铁的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
- 3D模型欣赏:永恒之王异形机甲风
- java json设置编码_java-JSON字符编码
- 惠普电脑win10关闭自动调节亮度
- nginx某条日志详解
- 高斯模糊与图像失焦,附Python代码实现
- mahout fpg
- USB 3G上网卡讲解之一
- python 使用随笔
热门文章
- JAVA黑白圆圈图形_CSS3 黑白交替旋转圆圈
- 服务化改造实践 | 如何在 Dubbo 中支持 REST
- 搭建“双11”大型网站架构必须掌握的 5 个核心知识
- 给你30秒的时间,你会用Excel制作出一个抽奖功能吗?
- 【Java并发编程】—–“J.U.C”:ConcurrentLinkedQueue
- ThinkPHP 3.2.2 在 volist 多重循环嵌套中使用 if 判断标签
- python魔法方法详解
- 大数据多属性的数据架构设计
- C#抽象类和抽象方法的特征和用途
- python的scramy架构_Python库: PrettyTable 模块