SAX解析XML文件

SAX是Simple API for
XML的缩写,它并不是由W3C官方所提出的标准。SAX是一种轻量型的方法,不像DOM解析时,把XML文档全部载入内存中,在PC上操作,Dom还有
优势,但在手机中端上则无优势,因为手机内存和硬件都比不上PC强。使用 SAX 是比较安全的,并且 Android 提供了一种传统的
SAX 使用方法,以及一个便捷的 SAX
包装器。SAX采用基于事件驱动的处理方式,它将XML文档转换成一系列的事件,由单独的事件处理器来决定如何处理。

在SAX接口中,事件源是org.xml.sax包中的XMLReader,它通过parser()方法来解析XML文档,并根据文档的内容产生事件。而
事件处理器则是org.xml.sax包中的ContentHander、DTDHander、ErrorHandler,以及
EntityResolver这4个接口,它们分别处理事件源在解析XML文档过程中产生的不同种类的事件。在开发中没有必要直接从这4个接口直接继承,
因为org.xml.sax.helper包提供了类DefaultHandler,其继承了这4个接口,在实际开发中直接从
DefaultHandler继承并实现相关函数就可以了。

SAX解析过程分为5个步骤:

1、


/**
* 解析XML时,当开始读取XML文档时
*/
@Override
public void startDocument() throws SAXException {
peoples = new HashSet<People>();
phones = new HashSet<Phone>();
}

2、


/**
* 解析XML时,当开始读到一个元素标签开始时
*/
@Override
public void startElement(String uri, String localName, String name,
Attributes attributes) throws SAXException {
if (name.equals("person")) {
people = new People();
}
if (name.equals("phone")) {
phone = new Phone();
}
currentTag = name;
}

3、


@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
// 判断当前标签是否有效
if (people != null) {
// //读取标签里面的内容
String value = new String(ch, start, length);
// 如果是Id标签,则读取Id标签的内容设置到Person的ID值上
if ("pid".equalsIgnoreCase(currentTag)) {
people.setPid(value);
} else if ("pname".equalsIgnoreCase(currentTag)) {// name标签
people.setPname(value);
} else if ("page".equalsIgnoreCase(currentTag)) {// age标签
people.setPage(value);
} else if ("psex".equalsIgnoreCase(currentTag)) {// address标签
people.setPsex(value);
} else if ("mPhone".equalsIgnoreCase(currentTag)) {
phone.setmPhone(value);
} else if ("fPhone".equalsIgnoreCase(currentTag)) {
phone.setfPhone(value);
}
}
}

4、


 /**
* 解析XML时,当读到结束一个元素标签时
*/
@Override
public void endElement(String uri, String localName, String name)
throws SAXException {
// 如果当前结束的标签名是person的话,代表一个person对象已经读取完毕。将其添加到list后置空
if(people!=null&&name.equals("person")){
people.setPhones(phones);
peoples.add(people);
people = null;
phones = new HashSet<Phone>();
}
if(phone!=null&&name.equals("phone")) {
phones.add(phone);
phone = null;
}
// 将当前标签名置空
currentTag = null;

}

5、


/**
* 结束读取XML
*/
@Override
public void endDocument() throws SAXException {

}

具体实例:

people.xml


<?xml version="1.0" encoding="UTF-8"?>

<!--认得信息xml文件-->
<peoples>
<person>
<pid>1</pid>
<pname>张三</pname>
<psex>男</psex>
<page>20</page>
<phone>
<mPhone>11111111111</mPhone>
<fPhone>1234321</fPhone>
</phone>
</person>
<person>
<pid>2</pid>
<pname>王五</pname>
<psex>男</psex>
<page>20</page>
<phone>
<mPhone>12222222222</mPhone>
<fPhone>4445556</fPhone>
</phone>
</person>
<person>
<pid>3</pid>
<pname>李四</pname>
<psex>男</psex>
<page>20</page>
<phone>
<mPhone>33333333332</mPhone>
<fPhone>1234321</fPhone>
</phone>
</person>
</peoples>

People.java实体类


import java.util.Set;

public class People {

private String pid;
private String pname;
private String psex;
private String page;
private Set<Phone> phones;
/**
* @return the pid
*/
public String getPid() {
return pid;
}
/**
* @param value the pid to set
*/
public void setPid(String value) {
this.pid = value;
}
/**
* @return the pname
*/
public String getPname() {
return pname;
}
/**
* @param pname the pname to set
*/
public void setPname(String pname) {
this.pname = pname;
}
/**
* @return the psex
*/
public String getPsex() {
return psex;
}
/**
* @param psex the psex to set
*/
public void setPsex(String psex) {
this.psex = psex;
}
/**
* @return the page
*/
public String getPage() {
return page;
}
/**
* @param page the page to set
*/
public void setPage(String page) {
this.page = page;
}
/**
* @return the phones
*/
public Set<Phone> getPhones() {
return phones;
}
/**
* @param phones the phones to set
*/
public void setPhones(Set<Phone> phones) {
this.phones = phones;
}

}

Phone.java实体类


public class Phone {

private String mPhone;
private String fPhone;
/**
* @return the mPhone
*/
public String getmPhone() {
return mPhone;
}
/**
* @param mPhone the mPhone to set
*/
public void setmPhone(String mPhone) {
this.mPhone = mPhone;
}
/**
* @return the fPhone
*/
public String getfPhone() {
return fPhone;
}
/**
* @param fPhone the fPhone to set
*/
public void setfPhone(String fPhone) {
this.fPhone = fPhone;
}

}

SAXXmlService解析类


import java.util.HashSet;
import java.util.Set;

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

public class SAXXmlService extends DefaultHandler{

private People people ;
private Phone phone ;
// //定义一个Person引用
// 此处将XML里的数据封装成People类
private Set<People> peoples ;
private Set<Phone> phones ;
// 定义一个标记变量,标记当前的XML文件被解析到哪个标签
private String currentTag ;

/**
* 解析XML时,当开始读取XML文档时
*/
@Override
public void startDocument() throws SAXException {
peoples = new HashSet<People>();
phones = new HashSet<Phone>();
}

@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
// 判断当前标签是否有效
if (people != null) {
// //读取标签里面的内容
String value = new String(ch, start, length);
// 如果是Id标签,则读取Id标签的内容设置到Person的ID值上
if ("pid".equalsIgnoreCase(currentTag)) {
people.setPid(value);
} else if ("pname".equalsIgnoreCase(currentTag)) {// name标签
people.setPname(value);
} else if ("page".equalsIgnoreCase(currentTag)) {// age标签
people.setPage(value);
} else if ("psex".equalsIgnoreCase(currentTag)) {// address标签
people.setPsex(value);
} else if ("mPhone".equalsIgnoreCase(currentTag)) {
phone.setmPhone(value);
} else if ("fPhone".equalsIgnoreCase(currentTag)) {
phone.setfPhone(value);
}
}
}

/**
* 解析XML时,当开始读到一个元素标签开始时
*/
@Override
public void startElement(String uri, String localName, String name,
Attributes attributes) throws SAXException {
if (name.equals("person")) {
people = new People();
}
if (name.equals("phone")) {
phone = new Phone();
}
currentTag = name;
}

/**
* 解析XML时,当读到结束一个元素标签时
*/
@Override
public void endElement(String uri, String localName, String name)
throws SAXException {
// 如果当前结束的标签名是person的话,代表一个person对象已经读取完毕。将其添加到list后置空
if(people!=null&&name.equals("person")){
people.setPhones(phones);
peoples.add(people);
people = null;
phones = new HashSet<Phone>();
}
if(phone!=null&&name.equals("phone")) {
phones.add(phone);
phone = null;
}
// 将当前标签名置空
currentTag = null;

}

/**
* 结束读取XML
*/
@Override
public void endDocument() throws SAXException {

}

/**
* @return the peoples
*/
public Set<People> getPeoples() {
return peoples;
}

/**
* @return the phones
*/
public Set<Phone> getPhones() {
return phones;
}

/**
* @param phones the phones to set
*/
public void setPhones(Set<Phone> phones) {
this.phones = phones;
}

}

SAXTest测试类


import java.io.IOException;
import java.io.InputStream;
import java.util.HashSet;
import java.util.Set;

import javax.ejb.Handle;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.SAXException;

public class SAXTest {

public static void main(String[] args) throws Exception {

Set<People> peoples = new SAXTest().parseXMLFile();
System.out.println(peoples);
System.out.println(peoples.size());
for(People people:peoples){
System.out.println(people.getPname());
System.out.println(people.getPsex());
System.out.println(people.getPage());

Set<Phone> phones = people.getPhones();
for(Phone phone:phones){
System.out.println(phone.getmPhone());
System.out.println(phone.getfPhone());
}
}

}

/**
*
* 解析文档
*/


private Set<People> parseXMLFile() throws Exception{
//创建解析器工厂
SAXParserFactory factory = SAXParserFactory.newInstance();
//创建解析器
SAXParser saxParse = factory.newSAXParser();
//创建输入流
InputStream is = SAXTest.class.getClassLoader().getResourceAsStream("people.xml");

//得到sax解析类
SAXXmlService handle = new SAXXmlService();
//开始解析
saxParse.parse(is, handle);
is.close();
return handle.getPeoples();

}


}

执行结果:


[[email protected], [email protected], [email protected]]
3
people3
name======李四
sex======男
age======20
手机======33333333332
座机======1234321
people1
name======张三
sex======男
age======20
手机======11111111111
座机======1234321
people2
name======王五
sex======男
age======20
手机======12222222222
座机======4445556

SAX解析XML文件,布布扣,bubuko.com

时间: 2024-12-10 00:51:25

SAX解析XML文件的相关文章

JAVA SAX解析XML文件

[代码] [Java]代码view sourceprint?001package SAXparse;002 003 004import java.io.FileInputStream;005import java.lang.reflect.Array;006import java.lang.reflect.InvocationTargetException;007import java.lang.reflect.Method;008import java.text.ParseException;

SAX解析XML文件实例代码

import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.s

Python—使用xml.sax解析xml文件

什么是sax? SAX是一种基于事件驱动的API. 利用SAX解析XML文档牵涉到两个部分:解析器和事件处理器. 解析器负责读取XML文档,并向事件处理器发送事件,如元素开始跟元素结束事件; 而事件处理器则负责对事件作出相应,对传递的XML数据进行处理. sax适于处理下面的问题: 1.对大型文件进行处理: 2.只需要文件的部分内容,或者只需从文件中得到特定信息: 3.想建立自己的对象模型的时候. 在python中使用sax方式处理xml要先引入xml.sax中的parse函数,还有xml.sa

cocos2d-x 3.0 使用Sax解析xml文件(中国显示器问题解决)

今天是个好日子.我以为事情可以变得,明天是个好日子.打开门儿春风... 恩,听着歌写文档生活就是这么享受. 今天曾经的邻居大神突然在qq上赞了我一下,这让我异常激动啊.. 这还要从前前前几天说起,那会无意间看到cocos微信上的一个实话实说活动.反正就是參加了能够抽奖这样子啦.没错.我就是本着那官方T恤去的,本着分子越大分母越大抽奖几率越大的原则,然后就连着发了一番感慨.并且还都是比較罗嗦,没想到隔天cocos君居然给我回复了,中奖了有木有,cocos2dx的官方T恤,哈哈. .然后就是曾经的大

安卓SAX解析XML文件

XML文件常用的解析方式有DOM解析,SAX解析. 一.Sax SAX(simpleAPIforXML)是一种XML解析的替代方法.相比于DOM,SAX是一种速度更快,更有效的方法.它逐行扫描文档,一边扫描一边解析.而且相比于DOM,SAX可以在解析文档的任意时刻停止解析,但任何事物都有其相反的一面,对于SAX来说就是操作复杂.SAX解析XML文档采用事件驱动模式.什么是事件驱动模式?它将XML文档转换成一系列的事件,由单独的事件处理器来决定如何处理.基于事件驱动的处理模式主要是基于事件源和事件

使用SAX解析XML文件

1 <?xml version="1.0" encoding="UTF-8"?> 2 <Code> 3 <SytmBankCode code="1256" name="长虹基金" logonId="6228400210568" password="123456" fieldXmlFile="changhong//browser//TestField

sax解析xml文件,封装到对象中

创建User.java类 public class User { private String id; private String name; private String age; private String password; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public

解析XML文件的两种方式 SAX和DOM

1.数据解析 解析的基本概念 所谓“解析”:从事先规定好的格式中提取数据 解析的前提:提前约定好格式,数据提供方按照格式提供数据.数据获取方则按照格式获取数据 iOS开发常见的解析:XML解析.JSON解析 2.XML数据结构 XML:Extensible Markup language(可扩展标记语言),主流数据格式之一,可以用来存储和传输数据. XML数据格式的功能 数据交换 内容管理 用作配置文件 XML数据结构的语法 声明 节点使用一对标签表示:起始和结束标签. 根节点是起始节点,只有一

UI进阶 解析XML文件的两种方式 SAX和DOM

1.数据解析 解析的基本概念 所谓“解析”:从事先规定好的格式中提取数据 解析的前提:提前约定好格式,数据提供方按照格式提供数据.数据获取方则按照格式获取数据 iOS开发常见的解析:XML解析.JSON解析 2.XML数据结构 XML:Extensible Markup language(可扩展标记语言),主流数据格式之一,可以用来存储和传输数据. XML数据格式的功能 数据交换 内容管理 用作配置文件 XML数据结构的语法 声明 节点使用一对标签表示:起始和结束标签. 根节点是起始节点,只有一