服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Android - Android提高之XML解析与生成实例详解

Android提高之XML解析与生成实例详解

2021-03-06 23:28Android开发网 Android

这篇文章主要介绍了Android的XML解析与生成方法,相信对大家的Android项目开发有一定的借鉴参考作用,需要的朋友可以参考下

本文实例讲述了使用sax来解析xml。通常来说在android里面可以使用sax和dom,dom需要把整个xml文件读入内存再解析,比较消耗内存,而sax是基于事件驱动的处理方式,可以在各节点触发回调函数,不过sax适合节点结构简单的xml文档,复杂的xml文档在后期的节点深度处理会有点麻烦。

本文要解析的test.xml文件如下:

?
1
2
3
4
5
6
7
8
<?xml version="1.0" encoding="utf-8"?>
<test>
 <title>testsax</title>
  <content aa="1" bb="2">
   <name>hellogv</name>
   <url>http://blog.csdn.net/hellogv</url>
  </content>
</test>

解析如上xml的结果如下图所示:

Android提高之XML解析与生成实例详解

使用sax解析,需要定义saxparserfactory(使应用程序能够配置和获取基于 sax 的解析器以解析 xml 文档),saxparser(从各种输入源解析 xml),xmlreader(使用回调函数读取 xml 文档),其中xmlreader是个关键。xmlreader可以为解析xml定义各种回调函数,“条件符合”的时候触发这些回调函数。

?
1
2
3
4
5
6
saxparserfactory factory = saxparserfactory.newinstance();
saxparser parser = factory.newsaxparser();
xmlreader reader = parser.getxmlreader();
reader.setcontenthandler(handler);
reader.parse(new inputsource(testsax.this.getresources()
 .openrawresource(r.raw.test)));

在这段代码里,xmlreader就调用继承defaulthandler的saxhandler。defaulthandler已实现contenthandler, dtdhandler, entityresolver, errorhandler等接口,包含常见读取xml的操作,具体请看下面的saxhandler.java源码。

最终生成xml的结果如下图所示:

Android提高之XML解析与生成实例详解

上图是读取各节点之后,使用xmlserializer重新组合并输出xml字符串。

本文的main.xml代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
<?xml version="1.0" encoding="utf-8"?>
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:orientation="vertical" android:layout_width="fill_parent"
 android:layout_height="fill_parent">
 <button android:layout_height="wrap_content"
 android:layout_width="fill_parent" android:id="@+id/btnsax"
 android:text="使用sax解析xml"></button>
 <button android:layout_height="wrap_content"
 android:layout_width="fill_parent" android:text="生成xml" android:id="@+id/btnoutput"></button>
 <edittext android:text="@+id/edittext01" android:id="@+id/edittext01"
 android:layout_width="fill_parent" android:layout_height="fill_parent"></edittext>
</linearlayout>

saxhandler.java的源码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
package com.testsax;
import java.util.arraylist;
import org.xml.sax.attributes;
import org.xml.sax.saxexception;
import org.xml.sax.helpers.defaulthandler;
import android.util.log;
public class saxhandler extends defaulthandler{
   private arraylist<string> keys = new arraylist<string>();//保存字段名称
   private arraylist<object> values = new arraylist<object>();//保存值
 @override
 public void startdocument() throws saxexception {
  super.startdocument();
 }
 @override
 public void enddocument() throws saxexception {
  super.enddocument();
 }
 @override
 public void startelement(string uri, string localname, string qname,
  attributes attributes) throws saxexception {
  //保存开始标记
  keys.add("starttag");
  values.add(localname);
  log.e("starttag",localname);
  //保存属性值
  for ( int i = 0; i < attributes.getlength(); i++ ){
  keys.add("attr");
  string[] str=new string[2];
  str[0]=attributes.getlocalname(i);
  str[1]=attributes.getvalue(i);
  values.add(str);
  log.e("attr",str[0]+"="+str[1]);
  }
 }
 @override
 public void endelement(string uri, string localname, string qname)
  throws saxexception {
  //保存结束标记
  keys.add("endtag");
  values.add(localname);
  log.e("endtag",localname);
 }
 @override
 public void characters(char[] ch, int start, int length)
  throws saxexception {
  string value = new string(ch, start, length);
  value = value.trim();
  if (value.length() == 0)
  return;
  keys.add("text");
  values.add(value);
  log.e("text",value);
 }
 public arraylist<string> getkeys()
 {
  return keys;
 }
 public arraylist<object> getvalues()
 {
  return values;
 }
}

testsax.java的源码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
package com.testsax;
import java.io.stringwriter;
import javax.xml.parsers.saxparser;
import javax.xml.parsers.saxparserfactory;
import org.xml.sax.inputsource;
import org.xml.sax.xmlreader;
import org.xmlpull.v1.xmlserializer;
import android.app.activity;
import android.os.bundle;
import android.util.xml;
import android.view.view;
import android.widget.button;
import android.widget.edittext;
 
public class testsax extends activity {
 /** called when the activity is first created. */
 button btnsax, btnoutput;
 edittext memo;
 saxhandler handler = new saxhandler();
 @override
 public void oncreate(bundle savedinstancestate) {
 super.oncreate(savedinstancestate);
 setcontentview(r.layout.main);
 btnsax = (button) this.findviewbyid(r.id.btnsax);
 btnsax.setonclicklistener(new clickevent());
 btnoutput = (button) this.findviewbyid(r.id.btnoutput);
 btnoutput.setonclicklistener(new clickevent());
 memo = (edittext) this.findviewbyid(r.id.edittext01);
 
 }
 class clickevent implements view.onclicklistener {
 
 @override
 public void onclick(view v) {
  if (v == btnsax) {//解析xml,并保存标记,属性等值
  try {
   saxparserfactory factory = saxparserfactory.newinstance();
   saxparser parser = factory.newsaxparser();
   xmlreader reader = parser.getxmlreader();
   reader.setcontenthandler(handler);
   reader.parse(new inputsource(testsax.this.getresources()
    .openrawresource(r.raw.test)));
  } catch (exception ee) {}
  }
  else if (v == btnoutput) {//生成xml
  try {
   xmlserializer serializer = xml.newserializer();
   stringwriter writer = new stringwriter();
   try {
   serializer.setoutput(writer);
   serializer.startdocument("utf-8",true);
   
   for(int i=0;i<handler.getkeys().size();i++)
   {
    if(handler.getkeys().get(i).equals("starttag"))
    {
    serializer.starttag("", (string) handler.getvalues().get(i));
    }
    else if(handler.getkeys().get(i).equals("attr")){
    string[] str= (string[]) handler.getvalues().get(i);
    serializer.attribute("",str[0],str[1]);
    }
    else if(handler.getkeys().get(i).equals("text"))
    serializer.text((string)handler.getvalues().get(i));
    else if(handler.getkeys().get(i).equals("endtag"))
    {
    serializer.endtag("", (string) handler.getvalues().get(i));
    }
   }
   serializer.enddocument();
   string text=writer.tostring();
   text=text.replace("><", ">/r/n<");
   memo.settext(text);//输出到文本框
   } catch (exception e) {
   throw new runtimeexception(e);
   }
  } catch (exception e) {}
  }
 }
 }
}

感兴趣的读者可以自己动手调试运行一下本实例代码,希望能对大家的android项目开发起到参考借鉴作用。

延伸 · 阅读

精彩推荐
  • AndroidAndroid中AsyncTask详细介绍

    Android中AsyncTask详细介绍

    这篇文章主要介绍了Android中AsyncTask详细介绍,AsyncTask是一个很常用的API,尤其异步处理数据并将数据应用到视图的操作场合,需要的朋友可以参考下...

    Android开发网7432021-03-11
  • AndroidAndroid实现固定屏幕显示的方法

    Android实现固定屏幕显示的方法

    这篇文章主要介绍了Android实现固定屏幕显示的方法,实例分析了Android屏幕固定显示所涉及的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下...

    鉴客6182021-03-27
  • AndroidAndroid实现Service获取当前位置(GPS+基站)的方法

    Android实现Service获取当前位置(GPS+基站)的方法

    这篇文章主要介绍了Android实现Service获取当前位置(GPS+基站)的方法,较为详细的分析了Service基于GPS位置的技巧,具有一定参考借鉴价值,需要的朋友可以参考下...

    Ruthless8332021-03-31
  • AndroidAndroid CardView+ViewPager实现ViewPager翻页动画的方法

    Android CardView+ViewPager实现ViewPager翻页动画的方法

    本篇文章主要介绍了Android CardView+ViewPager实现ViewPager翻页动画的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    Abby代黎明9592022-03-02
  • Android汇总Android视频录制中常见问题

    汇总Android视频录制中常见问题

    这篇文章主要汇总了Android视频录制中常见问题,帮助大家更好地解决Android视频录制中常见的问题,需要的朋友可以参考下...

    yh_thu5192021-04-28
  • AndroidAndroid编程解析XML方法详解(SAX,DOM与PULL)

    Android编程解析XML方法详解(SAX,DOM与PULL)

    这篇文章主要介绍了Android编程解析XML方法,结合实例形式详细分析了Android解析XML文件的常用方法与相关实现技巧,需要的朋友可以参考下...

    liuhe68810042021-05-03
  • AndroidAndroid程序设计之AIDL实例详解

    Android程序设计之AIDL实例详解

    这篇文章主要介绍了Android程序设计的AIDL,以一个完整实例的形式较为详细的讲述了AIDL的原理及实现方法,需要的朋友可以参考下...

    Android开发网4622021-03-09
  • AndroidAndroid界面效果UI开发资料汇总(附资料包)

    Android界面效果UI开发资料汇总(附资料包)

    android ui界面设计,友好的界面会提高用户体验度;同时也增强了android ui界面设计的难度,本文提供了一些常用开发资料(有下载哦)感兴趣的朋友可以了解下...

    Android开发网4652021-01-03