两种解析XML的方式
1、DOM 把文档看成一棵树,需要先把文档全部装载进去,操作简单方便,但是如果文档比较大则性能上比较有问题。
2、SAX 逐行解析,边扫描文档边解析。缺点是操作复杂,添加和删除比较麻烦
SAX ,全称是Simple API for XML,既是指一种接口,也是指一个软件包。
作为接口,SAX是事件驱动型XML解析的一个标准接口。
SAX的原理:简单地说就是对文档进行顺序扫描,当扫描到文档开始与结束、元素开始与结束、文档结束等地方时通知事件处理函数,由事件处理函数做相应动作,然后继续同样的扫描,直至文档结束。
大多数SAX实现都会产生以下类型的事件
{
在文档的开始和结束时触发文档处理事件。
在文档内每一XML元素接受解析的前后触发元素事件。
任何数据通常都由单独的事件交付
在处理文档的DTD或Schema时产生DTD或Schema事件
产生错误事件用来通知主机应用程序解析错误。
}
解析文档过程
对于如下文档
<doc>
<para>hello</para>
</doc>
在解析文档的过程中会产生如下一系列事件:
start document
start element:doc
start element:para
characters:hello
end element:para
end element:doc
end document
1、创建事件处理程序
2、创建SAX解析器
3、将事件处理程序分配给解析器
4、对文档进行解析,将每个事件发送给处理程序。
SAX的常用接口介绍
ContentHandler接口
ContentHandler是JAVA类包中一个特殊的SAX接口,位于org.xml.sax包中。该接口封装了一些对事件处理的方法,当XML解析器开始解析XML输入文档时,它会遇到某些特殊的事件,比如文档的开头和结束、元素开头和结束、以及元素中的字符数据等事件。当遇到这些事件时,XML解析器会调用ContentHandler接口中相应的方法来响应该事件。
ContentHandler接口的方法有以下几种:
void startDocument()
void endDocument()
void startElements(String namespaceURI,String localName, String qName, Attributes atts)
命名空间的URI 不带前缀的标签名 带前缀的标签名 标签属性
attr.getLocalName(i)得到第i+1个属性名 attr.getValue(i) 得到第i+1个属性值
void endElements(String namespaceURI,String localName, String qName)
void characters(char[] ch, int start, intlength)
String resultStr = 。。。。。。; //存放XML文件内容
创建一个SAXParserFactory
SAXParserFactory factory =SAXParserFactory.newInstance();
XMLReader reader =factory.newSAXParser().getXMLReader();
//为XMLReader设置内容处理器
reader.setContentHandler(newMyContentHandler()); MyContentHandler是一个继承了DefaultHandler的类(之所以不通过实现ContentHandler接口,是因为不需要实现接口的所有方法)
//开始解析文件
reader.parse(new InputSource(newStringReader(resultStr)));