代码如下:
package com.iplay.manualServer;
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.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class SaxParsexXML {
public static void main(String[] args) {
//1.创建解析工厂类
SAXParserFactory factory = SAXParserFactory.newInstance();
//2.创建解析器
try {
SAXParser saxParser = factory.newSAXParser();
//3.编写Handler类,处理xml
PHandler handler = new PHandler();
//4.开始解析
saxParser.parse(Thread.currentThread().getContextClassLoader().getResourceAsStream("com/iplay/manualServer/person.xml"), handler);
List<Person> persons = handler.getPersons();
System.out.println(persons.toString());
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
class PHandler extends DefaultHandler{
private List<Person> persons;
private Person person;
private String tag;
@Override
public void startDocument() throws SAXException {
System.out.println("----开始解析----");
persons = new ArrayList<>();
}
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
System.out.println("开始解析qName--->"+qName);
if(null != qName) {
tag = qName;
if(qName.equals("person")) {
person = new Person();
}
}
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
if(tag != null) {
if(tag.equals("name")) {
String content = new String(ch, start, length).trim();
person.setName(content);
} else if(tag.equals("age")) {
String content = new String(ch, start, length).trim();
person.setAge(Integer.valueOf(content == "" ? "0" : content));
}
}
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
System.out.println("结束解析qName--->"+qName);
if(qName.equals("person")) {
persons.add(person);
}
tag = null;//tag重置为null,空字符串不会覆盖name和age的数据
}
@Override
public void endDocument() throws SAXException {
System.out.println("----结束解析----");
}
public List<Person> getPersons() {
return persons;
}
}
SAX(Simple API for XML)解析
流模型中的"推"模型分析方式。通过事件驱动,每发现一个节点就引发一个事件,事件推给事件处理器,通过回调方法
完成解析工作,解析XML文档的逻辑需要应用程序完成
【优势】
①不需要等待所有数据都被处理,分析就能立即开始。
②只在读取数据时检查数据,不需要保存在内存中。
③可以在某个条件得到满足时停止解析,不必解析整个文档。
④效率和性能较高,能解析大于系统内存的文档。
【缺点】
①需要应用程序自己负责TAG的处理逻辑(例如维护父/子关系等),文档越复杂程序就越复杂。
②单向导航,无法定位文档层次,很难同时访问同一文档的不同部分数据,不支持XPath。
【原理】
简单的说就是对文档进行顺序扫描,当扫描到文档(document)开始与结束、元素(element)开始与结束时通知事件
处理函数(回调函数),进行相应处理,直到文档结束
【事件处理器类型】
①访问XML DTD:DTDHandler
②低级访问解析错误:ErrorHandler
③访问文档内容:ContextHandler
【DefaultHandler类】
SAX事件处理程序的默认基类,实现了DTDHandler、ErrorHandler、ContextHandler和EntityResolver接口,通常
做法是,继承该基类,重写需要的方法,如startDocument()