Android中XML构建与解析

来源:互联网 发布:淘宝去哪里找货源 编辑:程序博客网 时间:2024/05/17 02:38


1、引言

要了解今天的主要内容,首先要知道什么事xml?xml的英文名字是Exteile Marku Laguage,中文翻译称之为可扩展标记语言。具体是什么含义,可以不用理解太深,毕竟我们做应用的,没涉及到这么深的理论。

在应用开发过程中,常见的从服务器返回的形式,有两种,一种是json格式,一种是xml格式,当然还有其它格式的返回形式,但是用到得比较少。今天我们重点理解在Android中的Xml构建与解析。

在Android中,它自身已经将xml文件的构建和解析放在里面,我们可以直接调用。


2、构建

下文是一段短信备份的代码,其中使用了xml文件对短信备份,

<pre name="code" class="java">/** * 备份短信 * @author ljtyzhr * @version 1.0 */public class BackupSmsService extends Service {private SmsInfoService smsInfoService;// 短信服务@Overridepublic IBinder onBind(Intent intent) {return null;}@Overridepublic void onCreate() {smsInfoService = new SmsInfoService(this);super.onCreate();new Thread(){public void run() {try {List<SmsInfo>  smsinfos = smsInfoService.getSmsInfos();// 将短信备份到 sd 卡上File file = new File("/sdcard/smsbackup.xml");XmlSerializer serializer = Xml.newSerializer();// 序列化FileOutputStream os = new FileOutputStream(file);// 输出流/** * 生成xml文件,先创建节点,然后创建内容 */serializer.setOutput(os, "utf-8");serializer.startDocument("utf-8", true);/*文件头*/serializer.startTag(null, "smss");serializer.startTag(null, "count");serializer.text(smsinfos.size() + "");serializer.endTag(null, "count");for(SmsInfo info : smsinfos){//最外层节点开始标签serializer.startTag(null, "sms");serializer.startTag(null, "id");serializer.text(info.getId());serializer.endTag(null, "id");serializer.startTag(null, "address");serializer.text(info.getAddress());serializer.endTag(null, "address");serializer.startTag(null, "date");serializer.text(info.getDate());serializer.endTag(null, "date");serializer.startTag(null, "type");serializer.text(info.getType() + "");serializer.endTag(null, "type");serializer.startTag(null, "body");serializer.text(info.getBody());serializer.endTag(null, "body");//最外层节点结束标签serializer.endTag(null, "sms");}serializer.endTag(null, "smss");/*文件尾*/serializer.endDocument();//把文件缓冲区的数据写出去os.flush();os.close();Looper.prepare();//子线程没有消息队列,需要使用LooperToast.makeText(getApplicationContext(), "备份完成", 1).show();Looper.loop();} catch (Exception e) {e.printStackTrace();Looper.prepare();Toast.makeText(getApplicationContext(), "备份失败", 1).show();Looper.loop();}}}.start();}}


3、解析

在构建中的代码,关键点已经给出了注释,想必不需要过多解释说明,下面我们来看看如何解析上面的一段代码:

/** * 还原短信 * @author ljtyzhr * @version 1.0 * @param path路径信息 * @param pd进度条 * @throws Exception */public void restoreSms(String path,ProgressDialog pd) throws Exception{File file = new File (path);ContentValues values = null;FileInputStream fis = new FileInputStream(file);XmlPullParser parser =  Xml.newPullParser();parser.setInput(fis, "utf-8");int type = parser.getEventType();int currentcount = 0;while ( type != XmlPullParser.END_DOCUMENT){switch (type) {case XmlPullParser.START_TAG:if("count".equals(parser.getName())){   String count =parser.nextText();   pd.setMax(Integer.parseInt(count));}// id是由系统自增长的,所以没有添加插入if("sms".equals(parser.getName())){values = new ContentValues();}else if("address".equals(parser.getName())){values.put("address", parser.nextText());}else if("date".equals(parser.getName())){values.put("date", parser.nextText());}else if("type".equals(parser.getName())){values.put("type", parser.nextText());}else if("body".equals(parser.getName())){values.put("body", parser.nextText());}break;case XmlPullParser.END_TAG:if("sms".equals(parser.getName())){ContentResolver resolver = context.getContentResolver();resolver.insert(Uri.parse("content://sms/"), values);values = null;currentcount++;// 动态显示当前还原比pd.setProgress(currentcount);}break;}type = parser.next();}}

4、总结

上文的构建xml文件与解析xml文件,都是使用的Android自身的jar文件,并没有使用其它的jar包。而这里也仅仅使用了一种xml中的pull解析,xml文件还有sax,dom解析等多种方式。在Android自身提供的解析方式,基本能够满足相应的需求,如果还需要对在Android中xml构建与解析有更深的了解。可以点击查看dom解析。

网络上还有一些介绍xml解析的文章,也未必靠谱,建议查看官网的说明,会比较方便。

0 0
原创粉丝点击