Java数据解析---SAX

时间:2023-11-25 21:28:32

一、Sax解析

是从头到尾逐行逐个元素读取内容,修改较为不便,但适用于只读的大文档。

Sax采用事件驱动的方式解析文档。简单点说,如同在电影院看电影一样,从头到尾看一遍就完了,不能回退(Dom可来来回回读取)

在看电影的过程中,每遇到一个情节,一段泪水,一次擦肩,你都会调动大脑和神经去接收或处理这些信息

同样,在Sax的解析过程中,读取到文档开头、结尾,元素的开头和结尾都会触发一些回调方法,你可以在这些回调方法中进行相应事件处理

这四个方法是:startDocument() 、 endDocument()、 startElement()、 endElement

此外,光读取到节点处是不够的,我们还需要characters()方法来仔细处理元素内包含的内容

将这些回调方法集合起来,便形成了一个类,这个类也就是我们需要的解析器

一般从Main方法中读取文档,却在解析器中处理文档,这就是所谓的事件驱动解析方法(解释为转载)

------------------------------------------------------------------------------------------------------------------------------------------------------

解析器中的方法:

1.解析文档开头

 @Override
public void startDocument() throws SAXException {
// TODO Auto-generated method stub
super.startDocument();
}

2.解析开始标签

 @Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
// TODO Auto-generated method stub
super.startElement(uri, localName, qName, attributes);
}

3.解析内容

 @Override
public void characters(char[] ch, int start, int length)
throws SAXException {
// TODO Auto-generated method stub
super.characters(ch, start, length);
}

4.解析结束标签

 @Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
// TODO Auto-generated method stub
super.endElement(uri, localName, qName);
}

5.解析文档结束

 @Override
public void endDocument() throws SAXException {
// TODO Auto-generated method stub
super.endDocument();
}

下面看一个Demo来实现解析一个xml文件

(1).xml文件

 <?xml version="1.0" encoding="UTF-8"?>
<persons>
<person>
<name>张三</name>
<age></age>
<sex>男</sex>
</person> <person>
<name>李四</name>
<age></age>
<sex>女</sex>
</person> <person>
<name>王五</name>
<age></age>
<sex>男</sex>
</person>
</persons>

user.xml

(2)解析器

 package saxparser;

 import java.util.ArrayList;
import java.util.List; import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler; public class Myhandle extends DefaultHandler{
//一个列表集合用来存放对象
List<Student> list = null;
Student stu = null;
//存放标签名称
String str = null;
//文件开始
@Override
public void startDocument() throws SAXException {
// TODO Auto-generated method stub
super.startDocument();
System.out.println("文件解析开始");
//准备工作,创建列表集合对象
list = new ArrayList<Student>();
}
//标签开始
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
// TODO Auto-generated method stub
super.startElement(uri, localName, qName, attributes);
str=qName;
//标签到这里说明有<person>数据了,需要创建一个Student对象存放解析出来的数据
if("person".equals(str))
{
stu = new Student();
// if(attributes!=null) 如果标签<person>里有属性的话
// {
// for(int i=0;i<attributes.getLength();i++)
// {
// //得到属性名
// String attrName = attributes.getQName(i);
// //得到属性值
// String attrValue = attributes.getValue(i);
//
// if("id".equals(attrName))
// {
// stu.setId(attrValue);
// }
// }
// }
}
}
//内容解析
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
// TODO Auto-generated method stub
super.characters(ch, start, length);
//获得解析的标签内容
String s = new String(ch,start,length);
if("name".equals(str))
{
stu.setName(s);
}
else if("age".equals(str))
{
stu.setAge(Integer.parseInt(s));
}
else if("id".equals(str))
{
stu.setAge(Integer.parseInt(s));
}
}
//结束标签解析
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
// TODO Auto-generated method stub
super.endElement(uri, localName, qName);
//注意这里,存放标签名字的str字符串必须要置空,=null or =""
str=null;
if("person".equals(qName))
{
list.add(stu);
}
}
//结束文件解析
@Override
public void endDocument() throws SAXException {
// TODO Auto-generated method stub
super.endDocument();
System.out.println("文件解析结束");
} public List<Student> list(){
return list;//返回列表集合
}
} Myhandle.java 解析器

Myhandle.java解析器

(3)测试类

 package saxparser;

 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.sax.SAXException; public class Text {
public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
//创建解析的工厂类对象
SAXParserFactory factory = SAXParserFactory.newInstance();
//创建解析器对象
SAXParser parser = factory.newSAXParser(); File f= new File("user.xml");
//解析器去读取xml文件并去调用handle里边的函数
Myhandle handle = new Myhandle();
parser.parse(f, handle);
//获得存放Student对象的集合
List<Student> list = handle.list;
//遍历集合
for(int i=;i<list.size();i++)
{
System.out.println(list.get(i));
} }
}

(4).对象类

 package saxparser;

 public class Student {
private int id;
private String name ;
private int age;
public Student() {
super();
// TODO Auto-generated constructor stub
}
public Student(int id, String name, int age) {
super();
this.id = id;
this.name = name;
this.age = age;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + ", age=" + age + "]";
} }

Student

(5)控制台输出信息

 文件解析开始
文件解析结束
Student [id=, name=张三, age=]
Student [id=, name=李四, age=]
Student [id=, name=王五, age=]

控制台输出效果