您的位置:首页 > 移动开发 > Android开发

android_xml 文件解析

2015-04-22 23:00 218 查看
解析XML文件基本的解析方式有两种,一种叫SAX,另一种叫DOM:

1、DOM生成和解析XML文档

DOM,全称Document Object Model(文档对象模型),为 XML 文档的已解析版本定义了一组接口。解析器读入整个文档,然后构建一个驻留内存的树结构,然后代码就可以使用 DOM 接口来操作这个树结构。 优点:整个文档树在内存中,便于操作;支持删除、修改、重新排列等多种功能; 缺点:将整个文档调入内存(包括无用的节点),浪费时间和空间; 使用场合:一旦解析了文档还需多次访问这些数据;硬件资源充足(内存、CPU)。 

2、SAX生成和解析XML文档

为解决DOM的问题,出现了SAX。SAX ,事件驱动。当解析器发现元素开始、元素结束、文本、文档的开始或结束等时,发送事件,程序员编写响应这些事件的代码,保存数据。优点:不用事先调入整个文档,占用资源少;SAX解析器代码比DOM解析器代码小,适于Applet,下载。缺点:不是持久的;事件过后,若没保存数据,那么数据就丢了;无状态性;从事件中只能得到文本,但不知该文本属于哪个元素;使用场合:Applet;只需XML文档的少量内容,很少回头访问;机器内存少;等等

在这里就使用SAX来解析XML。

SAX全称SimpleAPI for XML,既是一种接口,也是指一个软件包。作为接口,SAX是事件驱动型XML解析的一个标准接口。
(1)SAX工作原理简单地说就是对文档进行顺序扫描,当扫描到文档(document)开始与结束、元素(element)开始与结束等地方时通知事件处理函数,由事件处理函数做相应动作,然后继续同样的扫描,直至文档结束。

(2)大部分SAX实现都会产生以下类型的事件

- 在文档的开始和结束时触发文档处理事件;

- 在文档内每一XML元素接受解析的前后触发元素事件;

- 任何元数据通常都由单独的事件交付;

- 在处理文档的DTD或Schema时产生DTD或Schema事件;

- 产生错误事件用来通知主机应用程序解析错误;

[b](3)SAX模型[/b]



(4)解析文档过程

对于这个文档
12<doc>

          3<para>4Hello World!5</para>6

</doc>7

总共产生7个事件,包括:

 - 创建事件处理程序;

 - 创建SAX解析器;

 - 将事件处理程序分配给解析器;

 - 对文档进行解析,将事件发送给处理程序;

ContentHandler接口是java类包中一个特殊的SAX接口,其中常用的接口有5个:

startDocument():Receive notification of the beginning of a document.

endDocument():Receive notification of the end of a document.

startElement(String uri, String localName, String qName, Attributes atts)

Receive notification of the beginning of an element.

endElement(String uri, String localName, String qName):Receive notification of the end of an element.

characters(char[] ch, int start, int length):Receive notification of character data.

[b](5)例子[/b]

XMLActivity.java

package chay.xml;

import java.io.StringReader;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;
import chay.utils.HttpDownloader;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class XMLActivity extends Activity {
private Button parseBtn;
String xmlStr = "<school><stu id='001'><name>Chay</name><sex>男</sex><age>22</age></stu><stu id='002'><name>Mark</name><sex>女</sex>	<age>40</age></stu></school>";

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
parseBtn = (Button) findViewById(R.id.parseBtn);
parseBtn.setOnClickListener(new ParseButtonListener());
}
// 按钮监听,点击开启线程
class ParseButtonListener implements OnClickListener {
public void onClick(View arg0) {
Thread t = new XMLThread();
t.start();
}
}

class XMLThread extends Thread {
@Override
public void run() {
//			String urlStr = "http://192.168.56.1:8080/mp3/resources.xml";
//			HttpDownloader hd = new HttpDownloader();
//			String xmlStr = hd.download(urlStr);
//			System.out.println(xmlStr);
try {
// 创建一个SAXParserFactory
SAXParserFactory factory = SAXParserFactory.newInstance();
XMLReader reader = factory.newSAXParser().getXMLReader();
// 为XMLReader设置内容处理器
reader.setContentHandler(new MyContentHandler());
// 开始解析xml,并且调用相应的事件响应函数
reader.parse(new InputSource(new StringReader(xmlStr)));
} catch (Exception e) {
e.printStackTrace();
}

}
}
}


XMLContentHandler.java
package chay.xml;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class XMLContentHandler extends DefaultHandler {
String name, sex, age;
String tagName;

@Override
public void startDocument() throws SAXException {
System.out.println("--- start Document ---");
}

@Override
public void endDocument() throws SAXException {
System.out.println("--- end Document ---");
}

//uri:得到当前解析正在解析标签的命名空间(namespaceURI,命名空间,是防止标签重名)
//localName:得到没有前缀标签 <abc:name>  得到name
//qName:得到带前缀的标签 <abc:name>  得到abc:name
//attr:得到标签的属性 <stu id="001">  得到id="001"
@Override
public void startElement(String uri, String localName, String qName,
Attributes attr) throws SAXException {
tagName = localName;
if (localName.equals("stu")) {
// 获取标签的所有属性
for (int i = 0; i < attr.getLength(); i++) {
System.out.println(attr.getLocalName(i) + "=" + attr.getValue(i));
}
}
}

@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
// 在stu标签解析完之后,打印所有得到的数据
tagName = "";
if (localName.equals("stu")) {
this.prinout();
}
}

@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
String temp = new String(ch, start, length);
if (tagName.equals("name")) {
name = new String(temp);
} else if (tagName.equals("sex")) {
sex = new String(temp);
} else if (tagName.equals("age")) {
age = new String(temp);
}
}

private void prinout() {
System.out.println("name--->" + name);
System.out.println("sex--->" + sex);
System.out.println("age--->" + age);
}
}
上面继承的是DefaultHandler而不是ContentHandler,这是一种适配器模式,因为ContentHandler中有很多的方法不用实现。

如果不能下载,请先将windows防火墙关闭。
more--->http://blog.csdn.net/liuhe688/article/details/6415593 

欢迎交流 http://blog.csdn.net/ycwol/article/details/45192151
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android xml