SAX解析XML
一、XML?
XML:eXtensible Makeup Language可扩展标记语言
二、SAX
SAX:simple api for xml,是一个事件监听接口,同时又是一个软件包
三、工作原理
SAX 允许您在读取文档时处理它,从而不必等待整个文档被存储之后才采取操作。
SAX API是一个基于事件的API ,适用于处理数据流,即随着数据的流动而依次处理数据。
SAX API在其解析您的文档时发生一定事件的时候会通知您。在您对其响应时,您不作保存的数据将会被抛弃。
SAX API中主要有四种处理事件的接口,它们分别是ContentHandler,DTDHandler, EntityResolver 和 ErrorHandler 。
DefaultHandler就是实现了上面的四个事件处理器接口,然后提供了每个抽象方法的默认实现,即DefaultHandler是一个适配器
四、例子
1.xml
<?xml version="1.0" encoding="UTF-8"?> <students><student id="1000"><username>linys</username> <password>linys</password> </student> <student id="1001"> <username>wangzd</username> <password>wangzd</password> </student> </students>
2.解析程序
(1)继承DefaultHandler
/**
*
* @Project: XMLParse
* @Desciption: 自定义的ContentHandler
* SAX 允许您在读取文档时处理它,从而不必等待整个文档被存储之后才采取操作。
* SAX API是一个基于事件的API ,适用于处理数据流,即随着数据的流动而依次处理数据。
* SAX API在其解析您的文档时发生一定事件的时候会通知您。在您对其响应时,您不作保存的数据将会被抛弃。
SAX API中主要有四种处理事件的接口,它们分别是ContentHandler,DTDHandler, EntityResolver 和 ErrorHandler 。
DefaultHandler就是实现了上面的四个事件处理器接口,然后提供了每个抽象方法的默认实现,即DefaultHandler是一个适配器
*
*
* 其中方法的执行顺序是:
* startDocument
*
* 每种不一样的标签启动不一样的事件(方法)
* 开始标签--startElement
* 结束标签--endElement
* 两标签间的内容(会自动提出换行)---characters
*
* endDocument
*
* @Author: LinYiSong
* @Date: 2011-4-1~2011-4-1
*/
class MyContentHandler extends DefaultHandler{
private String tagName;
private String id;
private String userName;
private String password;
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
System.out.println("characters in "+tagName+"="+new String(ch,start,length)+"!");
if("username".equals(tagName)){
userName=new String(ch,start,length);
}
if("password".equals(tagName)){
password=new String(ch,start,length);
}
}
@Override
public void startDocument() throws SAXException {
System.out.println("Document--start");
}
@Override
public void endDocument() throws SAXException {
System.out.println("Document--end");
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
System.out.println("ElementStart in "+localName);
tagName=qName;
if("student".equals(tagName)){
id=attributes.getValue("id");
}
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
System.out.println("ElementEnd in "+localName);
if("student".equals(qName)){
System.out.println("id="+id+" ,username="+userName+" ,password="+password);
}
tagName=null;
}
(2)调用解析
//解析
//生成SAX解析器工厂
SAXParserFactory factory=SAXParserFactory.newInstance();
try {
//从解析器中取出XMLReader
XMLReader reader=factory.newSAXParser().getXMLReader();
//注册ContentHandler
reader.setContentHandler(new MyContentHandler());
//指定解析的xml文件
reader.parse(new InputSource(new StringReader(content)));
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
其中content是指xml文件内容String形式