以下使用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应用进行反编译,包括XML文件的解析、DEX文件转换为CLASS文件以及CLASS文件转换为JAVA源代码的过程。 首先,我们需要了解反编译的主要目的,那就是为了学习和研究。尽管可以利用反编译...
Android系统概述,Android系统的开发综述,Android的Linux内核与驱动程序,Android的底层库和程序,Android的JAVA虚拟机 ...图,Android的XML解析,牛人Android提高篇,手把手教你用Android开发新浪微博客户端
在这个"android小结"中,我们可以探讨一些核心的Android知识点,包括但不限于源码解析、工具使用以及一个可能的示例项目"MainActivityDemo"。让我们逐一深入探讨。 **源码解析** 在Android开发中,理解源码是提升...
Android系统概述,Android系统的开发综述,Android的Linux内核与驱动程序,Android的底层库和程序,Android的JAVA虚拟机 ...图,Android的XML解析,牛人Android提高篇,手把手教你用Android开发新浪微博客户端
本文将对Android Camera的使用进行深入探讨,结合源码分析和工具的运用,帮助开发者更好地理解和掌握这一领域的知识。 首先,Android Camera API提供了两种主要的方式来访问和控制设备的摄像头:Camera API1(旧版...
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...
在Android开发中,有时我们需要对字符串进行操作,例如替换特定字符。`replaceAll`函数就是Java(也是Android)中处理字符串替换的一个重要方法。这个方法来自`String`类,允许我们用新的字符串替换掉原字符串中匹配...
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 ...
在 Android 中,可以使用 XmlPullParser 来解析 XML 格式数据。 解析 JSON 数据 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,用于存储和传输数据。在 Android 中,可以使用 JSONObject 和 ...
#### 四、小结 通过上述步骤,我们已经成功实现了基于`Button`的事件处理机制。用户可以点击按钮触发相应的操作,例如跳转到新的页面、改变文本视图的内容或者显示一条提示消息等。这种方法是Android应用开发中最...
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 使用...
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 ...
本章将探讨如何在Android环境中开发RSS阅读器应用,利用Android提供的网络请求、XML解析和UI组件等功能。 2.4 小结 本章介绍了Android移动平台的基本概念、特点和开发流程,为RSS阅读器的开发提供了理论基础。 ##...
- **JSON与XML:** 如何解析JSON和XML格式的数据。 **6.5 Web服务** - **RESTful API:** 介绍了RESTful API的设计原则和实现方法。 - **SOAP:** SOAP协议的使用场景。 **6.6 小结** - **回顾知识点:** 对本章...
然而,开发者可以通过在`AndroidManifest.xml`中对特定`Activity`进行配置,来控制屏幕旋转的行为。例如,给定的代码片段中,`AdActivity`被设定为: ```xml android:name=...
#### 四、小结 本文档详细介绍了Android UI开发中的关键知识点,特别是与界面设计密切相关的`android.content.res.Resources`和`android.graphics.Bitmap`两个类。通过学习这些基础知识,开发者可以更好地理解和...