通过SAX解析xml文件,由四部分组成,xml文件,文件存储类,解析类,处理器类。
以下为xml文件
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE students[
<!ELEMENT students (student+)>
<!ELEMENT student (sname,sage,ssex)>
<!ELEMENT sname (#PCDATA) >
<!ELEMENT sage (#PCDATA) >
<!ELEMENT ssex (#PCDATA) >
]>
<students>
<student>
<sname>万星明</sname>
<sage>23</sage>
<ssex>男</ssex>
</student>
<student>
<sname>卢玉枭</sname>
<sage>25</sage>
<ssex>女</ssex>
</student>
<student>
<sname>李前飞</sname>
<sage>24</sage>
<ssex>女</ssex>
</student>
</students>
以下是学生类,用于创建学生对象,存储从xml文件中读取的对象数据
/**
* @author 万星明
* @version 创建时间:2018年10月24日 上午10:51:17
* 学生信息类
*/
public class Student {
private String name;
private Integer age;
private String sex;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
以下是解析类,通过处理器,解析xml文件,将数据装入对象中,然后将对象放入集合
import java.util.List;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
/**
* @author 万星明
* @version 创建时间:2018年10月24日 上午10:54:02
* 类说明
*/
public class SaxParser {
public static void main(String[] args) throws Exception {
//创建sax解析器工厂对象
SAXParserFactory factory = SAXParserFactory.newInstance();
//通过sax解析器工厂对象创建sax解析器对象
SAXParser sp = factory.newSAXParser();
//创建处理器对象
StudentHandler sh = new StudentHandler();
//用sax解析器解析xml文档,并按处理器处理方式来解析内容
sp.parse("XML//Students.xml",sh);
//接收解析结果
List<Student> stuList=sh.stuList;
System.out.println("姓名\t年龄\t性别");
for (Student s : stuList) {
System.out.println(s.getName()+"\t"+s.getAge()+"\t"+s.getSex());
}
}
}
以下是xml处理器
import java.util.ArrayList;
import java.util.List;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
/**
* @author 万星明
* @version 创建时间:2018年10月24日 上午11:09:34
* 学生xml处理类
*/
public class StudentHandler extends DefaultHandler {
//存储解析出的Student对象的集合
public List<Student> stuList = null;
//声明一个变量,存储每次解析的标签名
public String lable;
//声明student变量
public Student stu;
//重写开始解析文档的方法
@Override
public void startDocument() throws SAXException {
stuList = new ArrayList<>();
// super.startDocument();
}
//重写开始解析标签的方法
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
//解析到student标签时,创建Student实例对象
lable = qName;
if(lable.equals("student")) {
stu = new Student();
}
// super.startElement(uri, localName, qName, attributes);
}
//重写解析标签内容的方法
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
String data = new String(ch,start,length);
if(lable.equals("sname")) {
stu.setName(data);
}else if(lable.equals("sage")){
stu.setAge(Integer.valueOf(data));
}else if(lable.equals("ssex")) {
stu.setSex(data);
}
// super.characters(ch, start, length);
}
//重写结束解析标签的方法
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
if(qName.equals("student")) {
stuList.add(stu);
}
// super.endElement(uri, localName, qName);
}
//重写结束解析文档的方法
@Override
public void endDocument() throws SAXException {
// super.endDocument();
}
}