以下使用SAX来解析XML,在Android里面可以使用SAX和DOM,DOM需要把整个XML文件读入内存再解析,比较消耗内存,而SAX基于事件驱动的处理方式,可以在各节点触发回调函数,不过SAX适合节点结构简单的XML文档,复杂的XML文档在后期的节点深度处理会有点麻烦。
本文要解析的test.xml文件如下:
view plaincopy to clipboardprint?
<?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 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的结果如下:
使用SAX解析,需要定义SAXParserFactory(使应用程序能够配置和获取基于 SAX 的解析器以解析 XML 文档),SAXParser(从各种输入源解析 XML),XMLReader(使用回调函数读取 XML 文档),其中XMLReader是个关键。XMLReader可以为解析XML定义各种回调函数,“条件符合”的时候触发这些回调函数。
view plaincopy to clipboardprint?
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)));
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的结果如下:
上图是读取各节点之后,使用XmlSerializer重新组合并输出XML字符串。
本文的main.xml代码如下:
view plaincopy to clipboardprint?
<?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>
<?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的源码如下:
view plaincopy to clipboardprint?
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;
}
}
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的源码如下:
view plaincopy to clipboardprint?
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系统概述,Android系统的开发综述,Android的Linux内核与驱动程序,Android的底层库和程序,Android的JAVA虚拟机 ...图,Android的XML解析,牛人Android提高篇,手把手教你用Android开发新浪微博客户端
Android系统概述,Android系统的开发综述,Android的Linux内核与驱动程序,Android的底层库和程序,Android的JAVA虚拟机 ...图,Android的XML解析,牛人Android提高篇,手把手教你用Android开发新浪微博客户端
1.5 小结 练习 第2章 Android开发环境 2.1 Java开发环境安装 2.1.1 安装JDK 2.1.2 安装Eclipse 2.1.3 Eclipse中文包的安装 2.2 Android SDK 2.2.1 安装ADT 2.2.2 安装Android SDK 2.3 Android...
1.8 小结 第2章 设置开发环境 2.1 设置环境 2.1.1 下载JDK 6 2.1.2 下载Eclipse 3.6 2.1.3 下载Android SDK 2.1.4 命令行窗口 2.1.5 安装ADT 2.2 了解基本组件 2.2.1 View 2.2.2 ...
INTERNET "/> 实验结果截图: 图表 1 选择城市界面 图表 2 城市天气界面 三、实验分析与小结: Socket通信开发步骤 (1)新建套接字,开启服务器监听 ServerSocket ss=new ServerSocket(3080) ; ss.accept(); (2)...
第三篇则对三个真实案例的开发步骤进行详细介绍 逐步向读者讲解Android手机应用程序的真实开发过程 同时在源代码中还包含了详细的注释 以尽量帮助读者掌握代码中的每一个细节 尽快掌握Android编程 本书的讲述...
1.8 小结 第2章 设置开发环境 2.1 设置环境 2.1.1 下载JDK 6 2.1.2 下载Eclipse 3.6 2.1.3 下载Android SDK 2.1.4 命令行窗口 2.1.5 安装ADT 2.2 了解基本组件 2.2.1 View 2.2.2 ...
1.7 本章小结 33 第2章 Android应用的界面编程 35 2.1 界面编程与视图(View)组件 36 2.1.1 视图组件与容器组件 36 2.1.2 使用XML布局文件控制UI 界面 40 2.1.3 在代码中控制UI界面 41 2.1.4 使用...
8.6.2 WebView中对JavaScript的支持 8.7 Gallery (画廊) 8.8 SlidingDrawer(滑动抽屉) 8.9 Dialog(对话框) 8.9.1 AlertDialog警告框 8.9.2 ProgressDialog进度框 8.9.3 DatePickerDialog & TimePickerDialog...
第1章 Android应用与开发环境 1 1.1 Android的发展和历史 2 1.1.1 Android的发展和简介 2 1.1.2 Android平台架构及特性 3 1.2 搭建Android开发环境 5 1.2.1 下载和安装Android SDK 5 ...19.10 本章小结 689
第1章 Android应用与开发环境 1 1.1 Android的发展和历史 2 1.1.1 Android的发展和简介 2 1.1.2 Android平台架构及特性 3 1.2 搭建Android开发环境 5 1.2.1 下载和安装Android SDK 5 ...19.10 本章小结 689
2.4 本章小结 15 第三章 跨域交互缓存处理设计 17 3.1 跨域交互缓存处理需求 17 3.1.1 缓存技术WebStorage 17 3.1.2 跨域交互缓存处理需求 17 3.1.3 页面回退管理需求 17 3.2 缓存处理机制 18 3.2.1 跨域缓存处理 18...
1.8 本章小结 12 2 浏览器中常见的安全概念 13 2.1 URL 13 2.1.1 URL的标准形式 15 2.1.2 IRI 16 2.1.3 URL的“可视化”问题——字形欺骗钓鱼攻击 18 2.1.4 国际化域名字形欺骗攻击 19 2.1.5 自纠错与Unicode...
1.5 小结 19 第2章 编辑模式的使用 20 2.1 编辑模式的应用场景 20 2.2 自动回复 20 2.2.1 被添加自动回复 21 2.2.2 消息自动回复 22 2.2.3 关键词自动回复 22 2.2.4 自动回复优先规则 24 ...