1.创建SAXParserFactory 实例。
SAXParserFactory factor = SAXParserFactory.newInstance();
2.通过SAXParserFactory 实例创建解析器实例。
SAXParser parser = factor.newSAXParser();
3.设置文件读入流
InputStream is = Demo1.class.getClassLoader().getResourceAsStream("Student.xml");
4.创建Handler实例
class myHandle extends DefaultHandler{
。。。。。
}
5.调用解析器方法
parser.parse(is,dh);
重点:DefaultHandler 子类方法的重写
概述:
startDocument():只会在文档开始解析的时候被调用,每次解析只会调用一次。
startElement():每次开始解析一个元素,即遇到元素标签开始的时候都会调用。
characters():每次解析到元素标签携带的内容时都会调用,即使该元素标签的内容为空或换行。可以使用new String(ch,off,len)获取内容。
endElement():每次结束解析一个元素,即遇到元素标签结束的时候都会调用。
import java.util.ArrayList;
import java.util.List;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class Demo1 {
public static void main(String[] args) throws Exception, Throwable {
SAXParserFactory factor = SAXParserFactory.newInstance();
SAXParser parser = factor.newSAXParser();
InputStream is = Demo1.class.getClassLoader().getResourceAsStream("Student.xml");
myHandle dh = new myHandle();
parser.parse(is, dh);
List<Student> list = dh.getList();
for (Student student : list) {
System.out.println(student);
}
}
}
class myHandle extends DefaultHandler{
private List<Student> list = null;
Student stu = null;
String currName = null;
@Override
public void startDocument() throws SAXException {
list = new ArrayList<Student>();
}
@Override
public void endDocument() throws SAXException {
}
@Override
public void startElement(String uri, String localName, String qName, Attributes attr) throws SAXException {
if("stu".equals(qName)){
stu = new Student();
/*stu.setName(qName);
stu.setAge(Integer.parseInt(qName));
stu.setGender(qName);*/
}
currName = qName;
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
if("stu".equals(qName)){
list.add(stu);
stu = null;
}
currName = null;//如果此处不赋空值,在接下来,读完节点,读空白时,会把空白赋值。例如,此时的currName = name;读完name节点,会去读取空白元素,此时重新调用characters方法,进入if("name")分支导致name 空白
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
String content = new String(ch,start,length);
if(currName!=null){
if("name".equals(currName)){
stu.setName(content);
}else if("age".equals(currName)){
stu.setAge(Integer.parseInt(content));
}else if("gender".equals(currName)){
stu.setGender(content);
}else if("email".equals(currName)){
stu.setEmail(content);
}
}
}
public List<Student> getList(){
return list;
}
}
SAXParserFactory factor = SAXParserFactory.newInstance();
2.通过SAXParserFactory 实例创建解析器实例。
SAXParser parser = factor.newSAXParser();
3.设置文件读入流
InputStream is = Demo1.class.getClassLoader().getResourceAsStream("Student.xml");
4.创建Handler实例
class myHandle extends DefaultHandler{
。。。。。
}
5.调用解析器方法
parser.parse(is,dh);
重点:DefaultHandler 子类方法的重写
概述:
startDocument():只会在文档开始解析的时候被调用,每次解析只会调用一次。
startElement():每次开始解析一个元素,即遇到元素标签开始的时候都会调用。
characters():每次解析到元素标签携带的内容时都会调用,即使该元素标签的内容为空或换行。可以使用new String(ch,off,len)获取内容。
endElement():每次结束解析一个元素,即遇到元素标签结束的时候都会调用。
endDocument():只会在文档解析结束的时候被调用,每次解析只会调用一次。
代码如下:
import java.util.ArrayList;
import java.util.List;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class Demo1 {
public static void main(String[] args) throws Exception, Throwable {
SAXParserFactory factor = SAXParserFactory.newInstance();
SAXParser parser = factor.newSAXParser();
InputStream is = Demo1.class.getClassLoader().getResourceAsStream("Student.xml");
myHandle dh = new myHandle();
parser.parse(is, dh);
List<Student> list = dh.getList();
for (Student student : list) {
System.out.println(student);
}
}
}
class myHandle extends DefaultHandler{
private List<Student> list = null;
Student stu = null;
String currName = null;
@Override
public void startDocument() throws SAXException {
list = new ArrayList<Student>();
}
@Override
public void endDocument() throws SAXException {
}
@Override
public void startElement(String uri, String localName, String qName, Attributes attr) throws SAXException {
if("stu".equals(qName)){
stu = new Student();
/*stu.setName(qName);
stu.setAge(Integer.parseInt(qName));
stu.setGender(qName);*/
}
currName = qName;
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
if("stu".equals(qName)){
list.add(stu);
stu = null;
}
currName = null;//如果此处不赋空值,在接下来,读完节点,读空白时,会把空白赋值。例如,此时的currName = name;读完name节点,会去读取空白元素,此时重新调用characters方法,进入if("name")分支导致name 空白
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
String content = new String(ch,start,length);
if(currName!=null){
if("name".equals(currName)){
stu.setName(content);
}else if("age".equals(currName)){
stu.setAge(Integer.parseInt(content));
}else if("gender".equals(currName)){
stu.setGender(content);
}else if("email".equals(currName)){
stu.setEmail(content);
}
}
}
public List<Student> getList(){
return list;
}
}