SAX
SAX(simple API for XML)是一种XML解析的方法,相比于DOM,SAX的解析更有效更快。
解析步骤
①获取解析工厂
②从解析工厂获取解析容器
③编写处理器
④加载Document处理器
⑤进行解析
详细步骤
①此解析模式使用了工厂设计模式,所以先需获取工厂
工厂全路径为:javax.xml.parsers.SAXParserFactory
另外还使用了单例设计模式,所以需通过静态方法newInstance()获取对象。
SAXParserFactory saxFactory = SAXParserFactory.newInstance()
②通过工厂获取解析容器
SAXParser myParser = saxFactory.newSAXParser()
③编写处理器是整个解析过程的重点
编写一个类继承import org.xml.sax.helpers.DefaultHandler类
并重写startDocument(),startElement(),characters()等方法进行解析
方法 | 作用 |
---|---|
startDocument() | 编写解析整个文档前需执行的操作 |
startElement() | 编写解析每个元素前需执行的操作(此时可解析元素的属性) |
characters() | 编写解析元素所包含内容时所执行的操作 |
endElement() | 编写每个元素解析完成之后需执行的操作 |
endDocument() | 编写整个文档解析完成之后需执行的操作 |
解析文档的实例:
Ps:此处的文档以我上一篇博客中编写的文档为例,结果使用容器进行存储
/**
* 重写处理器
* @author 81493
*
*/
class MyHandler extends DefaultHandler{
//联系单
private List<Map<String,String>> contacts;
//标记正在解析的元素
private String sign;
//标记是否解析
private boolean isAnaly;
//联系人
private Map<String, String> linkMan;
public MyHandler(){
this.contacts = new ArrayList<Map<String,String>>();
this.isAnaly = false;
this.sign = null;
}
public List<Map<String,String>> getContacts() {
return contacts;
}
/**
* 解析文档开始
*/
@Override
public void startDocument() throws SAXException {
System.out.println("解析文档开始");
}
/**
* 解析开始
*/
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
this.sign = qName;
if(this.sign.equals("Linkman")) {
//每个联系人都是一个map
this.linkMan = new LinkedHashMap<String, String>();
System.out.println("解析联系人开始");
//解析属性:标识号
this.linkMan.put(attributes.getQName(0),attributes.getValue(0));
}
if(!this.sign.equals("contacts") && !this.sign.equals("Linkman") && !this.sign.equals("EMail")) {
//标记可以解析的元素
this.isAnaly = true;
}
}
/**
* 解析内容
*/
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
if(isAnaly != false) {
this.linkMan.put(this.sign, new String(ch,start,length));
}
}
/**
* 解析结束
*/
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
this.isAnaly = false;
if(qName.equals("Linkman")) {
this.contacts.add(this.linkMan);
System.out.println("解析联系人结束");
}
}
/**
* 解析文档结束
*/
@Override
public void endDocument() throws SAXException {
System.out.println("解析文档结束");
}
}
④加载解析器
MyHandler myHandler = new MyHandler()
⑤解析
使用解析容器的parse方法:
第一参数为使用上下文类加载器获取到的xml文件流
第二个参数为处理器
myParser.parse(Thread.currentThread()
.getContextClassLoader()
.getResourceAsStream("com/mfqh/analyze/Contacts.xml"), myHandler);
测试结果
List<Map<String, String>> myContact = myHandler.getContacts();
for(Map<String,String> linkMan : myContact) {
for(String key : linkMan.keySet()) {
System.out.println(key+":"+linkMan.get(key));
}
System.out.println();
}
结果图: