1.什么是SAX
DOM的原理:把一个XML文档当成树,完全加载到内存中,不适合大文件处理
SAX的原理:逐行进行XML文档的解析,适合大文件处理,但操作较复杂,且添加节点麻烦
SAX = Simple API for XML
2.SAX基本原理
顺序逐行扫描,当扫描到文档开始与结束、元素开始与结束触发事件,以事件为驱动。
相关事件:
1.在文档开始和结束的时候处理事件
2.在文档内每一个XML元素接受解析前后触发事件
3.任何元数据通常都由单独的事件交付
4.在处理文档的DTD或Schema时产生事件
5.发生错误时产生事件
相关类:
SAXParserFactory //SAX工厂类
SAXParser //SAX解析类
SAXReader //SAX读取类
ContentHandler //内容事件
ErrorHandler //错误事件
DTDHandler //DTD事件
EntityResolver //元素事件
解析过程:
<doc>
<para>Hello Android</para>
</doc>
start document
start element : doc
start element : para
characters : Hello Android
end element : para
end element : doc
end document
解析步骤:
1.创建事件处理程序
2.创建SAX解析器
3.将事件处理程序分配给解析器
4.对文档进行解析,将每个事件发送给处理程序
3.SAX常用接口
ContentHandler接口
void startDocument()
void endDocument()
void startElement(String uri, String localName, String qName, Attributes atts)
void endElement(String uri, String localName, String qName)
void characters(char[] ch, int start, int length)
4.SAX解析
String xml = new DownloadHelper().DownloadString("http://...");
SAXParserFactory factory = SAXParserFactory.newInstance(); //创建工厂类
XmlReader reader = factory.newSAXParser().getXmlReader(); //获取读取器
reader.setContentHandler(new MyContentHandler());
reader.parse(new InputSourse(new StringReader(xml)));
public MyContentHandler extends DefaultHandler{
public void startDocument() throws SAXException{
System.out.println("start read...");
}
public void endDocument() throws SAXException{
System.out.println("end read...");
}
public void startElement(String nsUri, String localName, String qName, Attributes atts) throws SAXException{
//nsUri : 名字空间
//localName : 节点名称
//qName : 带前缀的节点名称
//attr : 节点的属性
if(localName.equals("worker")){
for(int i=0; i<attr.getLength; i++){
System.out.println(attr.getLocalName(i) + ":" + attr.getValue(i));
}
}
}
public void endElement() throws SAXException{
}
public void characters(char[] ch, int start, int length) throws SAXException{
//ch 节点中的内容(InnerText)
//start 从ch中的哪一位开始
//length 长度
String tmp = new String(ch, start, len);
}
}