DOM 解析和SAX解析 XML 文档
一、xml的解析方式Dom和SAX区别:
DOM:当按 照DOM模型解析XML文档时,就会在内存中构造一个对应的DOM树,它可以用于不同节点之间的遍历。然而,在遍历之前必须先完成DOM树的构造。因此, 在处理规模较大的XML文档时就很耗内存,占用资源较多。尤是只需要操作文档中一小部分时效率很低。DOM的优点在于它在内存中保存文档的整个模型。DOM的基本对象有5个:Document,Node,NodeList,Element和Attr
SAX:SAX是一个事实上的标准。与DOM不同的是,它是用事件驱动模型。解析XMl文档时每遇到一个开始或者结束标 签、或者属性、或者一条指令时,程序就产生一个事件来进行相应的处理。所以在操作文档之前不需要对整个文档进行解析。实际上,文档的各个部分可以在进行解 析的同时进行操作。因此,SAX相对于DOM来说更适合操作大文档。SAX提供了一种对XML文档进行顺序访问的模式,这是一种快速读XML数据的方式。
二、SAX解析 XML 文档
SAX采用事件处理的方式解析XML文件,利用 SAX 解析 XML 文档,涉及两个部分:解析器和事件处理器。
SAX方式解析XML文档:
案例:xml文件内容如下sax.xml
package sax;import java.io.InputStream;import javax.xml.XMLConstants;import javax.xml.parsers.ParserConfigurationException;import javax.xml.parsers.SAXParser;import javax.xml.parsers.SAXParserFactory;import org.junit.Test;import org.xml.sax.Attributes;import org.xml.sax.ContentHandler;import org.xml.sax.InputSource;import org.xml.sax.Locator;import org.xml.sax.SAXException;import org.xml.sax.XMLReader;public class SaxTest {@Testpublic void test() throws Exception{//sax解析器的工厂对象,使用SAXParserFactory创建SAX解析工厂SAXParserFactory factory=SAXParserFactory.newInstance();//工厂对象 创建解析器对象SAXParser saxParser=factory.newSAXParser();//工厂模式 装饰模式 单例模式//通过解析器对象得到一个XML的读取器XMLReader reader=saxParser.getXMLReader();InputStream is=this.getClass().getClassLoader().getResourceAsStream("sax//sax.xml");//设置读取器的事件处理器reader.setContentHandler(new MyContenHandler());//解析xml文件reader.parse(new InputSource(is));}class MyContenHandler implements ContentHandler{ boolean isOK=false;@Overridepublic void setDocumentLocator(Locator locator) {// TODO Auto-generated method stub}@Overridepublic void startDocument() throws SAXException {System.out.println("文档开始解析了");}@Overridepublic void endDocument() throws SAXException {System.out.println("文档解析完毕了");}@Overridepublic void startPrefixMapping(String prefix, String uri)throws SAXException {// TODO Auto-generated method stub}@Overridepublic void endPrefixMapping(String prefix) throws SAXException {// TODO Auto-generated method stub}@Overridepublic void startElement(String uri, String localName, String qName,Attributes atts) throws SAXException {if ("作者".equals(qName)) {isOK=true;System.out.println("作者开始");}}@Overridepublic void endElement(String uri, String localName, String qName)throws SAXException {if ("作者".equals(qName)) {System.out.println("作者完毕");isOK=false;}}@Overridepublic void characters(char[] ch, int start, int length)throws SAXException {if (isOK) {System.out.println(new String(ch,start,length));}}@Overridepublic void ignorableWhitespace(char[] ch, int start, int length)throws SAXException {// TODO Auto-generated method stub}@Overridepublic void processingInstruction(String target, String data)throws SAXException {// TODO Auto-generated method stub}@Overridepublic void skippedEntity(String name) throws SAXException {// TODO Auto-generated method stub}}}
startElement(String uri, String localName, String qName, Attributes attributes)
接收元素开始的通知。
uri
- 名称空间 URI,如果元素没有任何名称空间 URI,或者没有正在执行名称空间处理,则为空字符串。
localName
- 本地名称(不带前缀),如果没有正在执行名称空间处理,则为空字符串。
qName
- 限定的名称(带有前缀),如果限定的名称不可用,则为空字符串。
attributes
- 附加到元素的属性。如果没有属性,则它将是空的 Attributes 对象。
案例 xml文件web.xml