sax解析xml类似与流媒体,它不需要把整个文件读入内存,然后才解析,而是读入一部分就开始解析。在解析程序中用了一个栈存放了xml的每个节点,解析的时候直接取出该节点,然后取得对应的值。这个程序复写了DefaultHandler类的public void characters(char ch[], int start, int length)和startElement(String uri, String localName, String qName,Attributes attrs)方法。由于sax解析的特点,把每个student放入到容器的时候,老出现问题。
程序允许结果:
班级:30713
学号:3071300
姓名:小明
性别:男
年龄:10
班级:30713
学号:3071301
姓名:小花
性别:女
年龄:20
班级:30713
学号:3071302
姓名:不知道
性别:男
年龄:15
班级:30714
学号:3071400
姓名:小明
性别:男
年龄:10
班级:30714
学号:3071401
姓名:小花
性别:女
年龄:20
班级:30714
学号:3071402
姓名:不知道
性别:男
年龄:15
运行时间:47 毫秒
数据模型:
//Student.java
package com.xie.xmlparse.dom4j.modal;
public class Student {
private Long classId;
private Long stuId;
private String stuName;
private String stuSex;
private int stuAge;
public Long getClassId() {
return classId;
}
public void setClassId(Long classId) {
this.classId = classId;
}
public Long getStuId() {
return stuId;
}
public void setStuId(Long stuId) {
this.stuId = stuId;
}
public String getStuName() {
return stuName;
}
public void setStuName(String stuName) {
this.stuName = stuName;
}
public String getStuSex() {
return stuSex;
}
public void setStuSex(String stuSex) {
this.stuSex = stuSex;
}
public int getStuAge() {
return stuAge;
}
public void setStuAge(int stuAge) {
this.stuAge = stuAge;
}
}
配置文件:
//student.xml
<?xml version="1.0" encoding="UTF-8"?>
<school>
<class name="030713">
<student>
<stuid>03071300</stuid>
<stuname>小明</stuname>
<stusex>男</stusex>
<stuage>10</stuage>
</student>
<student>
<stuid>03071301</stuid>
<stuname>小花</stuname>
<stusex>女</stusex>
<stuage>20</stuage>
</student>
<student>
<stuid>03071302</stuid>
<stuname>不知道</stuname>
<stusex>男</stusex>
<stuage>15</stuage>
</student>
</class>
<class name="030714">
<student>
<stuid>03071400</stuid>
<stuname>小明</stuname>
<stusex>男</stusex>
<stuage>10</stuage>
</student>
<student>
<stuid>03071401</stuid>
<stuname>小花</stuname>
<stusex>女</stusex>
<stuage>20</stuage>
</student>
<student>
<stuid>03071402</stuid>
<stuname>不知道</stuname>
<stusex>男</stusex>
<stuage>15</stuage>
</student>
</class>
</school>
解析程序:
//ParseXml.java
package com.xie.xmlparse.sax;
import java.util.ArrayList;
import java.util.Stack;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import com.xie.xmlparse.dom4j.modal.Student;
//将xml中的数据读出
public class ParseXml extends DefaultHandler{
Stack<String> tags=new Stack<String>();
String classname="";
ArrayList<Student> asList=new ArrayList<Student>();
Student s=null;
ParseXml(){
super();
}
public static void main(String args[]) {
long lasting = System.currentTimeMillis();
try {
SAXParserFactory sf = SAXParserFactory.newInstance();
SAXParser sp = sf.newSAXParser();
ParseXml reader = new ParseXml();
sp.parse(new InputSource("D://project//XmlParse//xmlFiles//student.xml"), reader);
ArrayList<Student> asList=reader.asList;
for(int i=0;i<asList.size();i++){
Student s=asList.get(i);
System.out.println("班级:"+s.getClassId());
System.out.println("学号:"+s.getStuId());
System.out.println("姓名:"+s.getStuName());
System.out.println("性别:"+s.getStuSex());
System.out.println("年龄:"+s.getStuAge());
}
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("运行时间:"+(System.currentTimeMillis() - lasting)+" 毫秒");
}
public void characters(char ch[], int start, int length)throws SAXException {
while(!tags.empty()){
String tag = (String) tags.pop();
if (tag.equals("class")) {
classname=new String(ch,start-9,length-3);
//System.out.println("班级:" +classname);
}
if (tag.equals("stuid")) {
s=new Student();
s.setStuId(Long.parseLong(new String(ch,start,length)));
//System.out.println("学号:" +new String(ch,start,length));
//System.out.println("班级:" +classname);
s.setClassId(Long.parseLong(classname));
}else if (tag.equals("stuname")) {
s.setStuName(new String(ch, start, length));
//System.out.println("姓名:" +new String(ch, start, length));
}else if (tag.equals("stusex")) {
s.setStuSex(new String(ch, start, length));
//System.out.println("性别:" +new String(ch, start, length));
}else if (tag.equals("stuage")) {
s.setStuAge(Integer.parseInt(new String(ch, start, length)));
//System.out.println("年龄:" +new String(ch, start, length));
asList.add(s);
}
}
}
public void startElement(String uri, String localName, String qName,Attributes attrs) {
tags.push(qName);
}
}