1.一个类(例如MyDefaultHandler)继承DefaultHandler类
2.重写五个方法:
startDocument()//该方法第一个执行,只执行一次
startElement(String uri, String localName, String qName, Attributes att)//该方法会获取每一个标签
characters(char[] ch, int start, int length)//该方法会获取标签的文本内容
endElement(String uri, String localName, String qName)//该方法结束标签
endDocument()//最后执行。
3.创建解析对象
SAXParserFactory sax = SAXParserFactory.newInstance();
SAXParser parse = sax.newSAXParser();//创建解析对象
MyDefaultHandler hand = new MyDefaultHandler();
parse.parse(Thread.currentThread().getContextClassLoader().getResourceAsStream("MyXML/Student.xml"),hand);
例子:
1.创建XML文件
<?xml version="1.0" encoding="UTF-8"?>
<students>
<student score="23">
<name>"张三"</name>
<sex>女</sex>
<id>1003</id>
</student>
<student score="24">
<name>"李四"</name>
<sex>男</sex>
<id>1004</id>
</student>
<student id="1005">
<name>"张五"</name>
<sex>男</sex>
<score>25</score>
</student>
</students>
2.创建一个Students类,将解析的数据存储到该类的对象。
package MyXMl;
public class Students {
private int id;
private int socre;
private String name;
private String sex;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getSocre() {
return socre;
}
public void setSocre(int socre) {
this.socre = socre;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public String toString() {
return "Students [id=" + id + ", socre=" + socre + ", name=" + name + ", sex=" + sex + "]";
}
}
3.创建MyDefaultHandler类继承DefaultHandler类,并实现五个方法的重写
package SAXParse;
import java.util.ArrayList;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import MyXMl.Students;
//1.继承DefaultHandler类
public class MyDefaultHandler extends DefaultHandler {
private Students stu ;
private ArrayList<Students> list;
private String tag;// 用于保存扫描到的起始标签
// 2.重写五个方法
@Override // 该方法第一个执行,只执行一次
public void startDocument() throws SAXException {
super.startDocument();
list = new ArrayList<Students>();
}
@Override
public void startElement(String uri, String localName, String qName, Attributes att) throws SAXException {
super.startElement(uri, localName, qName, att);
tag = qName;// 标签名称
if ("student".equals(tag)) {
stu = new Students();//创建Students对象去存储解析数据
// 形参att表示标签的属性
for (int i = 0; i < att.getLength(); i++) {
if ("name".equals(att.getQName(i))) {
stu.setName(att.getValue(i));
}
if ("sex".equals(att.getQName(i))) {
stu.setSex(att.getValue(i));
}
if ("id".equals(att.getQName(i))) {
stu.setId(Integer.parseInt(att.getValue(i)));
}
if ("score".equals(att.getQName(i))) {
stu.setSocre(Integer.parseInt(att.getValue(i)));
}
}
}
}
@Override // 获取文本内容
public void characters(char[] ch, int start, int length) throws SAXException {
super.characters(ch, start, length);
String str = new String(ch, start, length);
if ("name".equals(tag)) {
stu.setName(str);
}
if ("sex".equals(tag)) {
stu.setSex(str);
}
if ("id".equals(tag)) {
stu.setId(Integer.parseInt(str));
}
if ("score".equals(tag)) {
stu.setSocre(Integer.parseInt(str));
}
}
@Override // 结束标签。在结束标签中将对象存储到集合
public void endElement(String uri, String localName, String qName) throws SAXException {
super.endElement(uri, localName, qName);
tag = "";//置空
if ("student".equals(qName)) {
list.add(stu);
}
}
@Override
public void endDocument() throws SAXException {
super.endDocument();
}
public ArrayList<Students> getList() {
return list;//将存储Student对象的集合返回
}
}
3、主类测试(在主类中创建解析对象):
package SAXParse;
import java.util.ArrayList;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import MyXMl.Students;
public class SAXParse {
//sax解析为事件驱动型
public static void main(String[] args)throws Exception {
SAXParserFactory sax = SAXParserFactory.newInstance();
SAXParser parse = sax.newSAXParser();//创建解析对象
MyDefaultHandler hand = new MyDefaultHandler();
parse.parse(Thread.currentThread().getContextClassLoader().getResourceAsStream("MyXML/Student.xml"),hand);
ArrayList<Students>list =hand.getList();
for(Students a:list) {//遍历输出存储Students的集合
System.out.println(a);
}
}
}
运行结果: