日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android XML小工具

發布時間:2025/7/14 Android 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android XML小工具 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Android?XML小工具 一、概述 XML與Object互相轉化,支持8種基本類型、String和byte[]。byte[]需要經由base64編碼(API8以后才有,之前版本可以自己拷入)。 更多代碼及測試用例,見附件工程! 二、Object?–>?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); ?
  • ????} ?
  • ?
  • }?
  • 三、XML?->?Object
  • 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)); ?
  • ????????????} ?
  • ????????}?//?其他類型暫不需要 ?
  • ????} ?
  • ?
  • }?
  • 四、后記 Json與Object互相轉化,可看《Android實時繪制效果》附件工程內的JsonUtil。

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





    ? ? ?本文轉自winorlose2000 51CTO博客,原文鏈接:http://blog.51cto.com/vaero/900852,如需轉載請自行聯系原作者



    總結

    以上是生活随笔為你收集整理的Android XML小工具的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。