用Jaxp包中的SAX技术对XML文件进行解析并完成对文件的读取操作.doc

来源:互联网 发布:php短网址源码 编辑:程序博客网 时间:2024/05/18 03:20

由于SAX解析相对于DOM解析来说有一定的优点,所以在一些特定的场合下我们会使用SAX技术完成对XML文件的解析。

 

具体来看:

 

SAX解析

 

在使用 DOM 解析 XML 文档时,需要读取整个 XML 文档,在内存中构架代表整个 DOM 树的Doucment对象,从而再对XML文档进行操作。此种情况下,如果 XML 文档特别大,就会消耗计算机的大量内存,并且容易导致内存溢出。

 

SAX解析允许在读取文档的时候,即对文档进行处理,而不必等到整个文档装载完才会文档进行操作。

 

SAX采用事件处理的方式解析XML文件,利用 SAX 解析 XML 文档,涉及两个部分:解析器和事件处理器:

•        解析器可以使用JAXP的API创建,创建出SAX解析器后,就可以指定解析器去解析某个XML文档。

•        解析器采用SAX方式在解析某个XML文档时,它只要解析到XML文档的一个组成部分,都会去调用事件处理器的一个方法,解析器在调用事件处理器的方法时,会把当前解析到的xml文件内容作为方法的参数传递给事件处理器。

•        事件处理器由程序员编写,程序员通过事件处理器中方法的参数,就可以很轻松地得到sax解析器解析到的数据,从而可以决定如何对数据进行处理。

 

阅读ContentHandler API文档,常用方法:startElement、endElement、characters

SAX方式解析XML文档步骤

 

使用SAXParserFactory创建SAX解析工厂

SAXParserFactory spf =SAXParserFactory.newInstance();

 

通过SAX解析工厂得到解析器对象         

SAXParser sp = spf.newSAXParser();

 

通过解析器对象得到一个XML的读取器

XMLReader xmlReader = sp.getXMLReader();

 

设置读取器的事件处理器           

xmlReader.setContentHandler(newBookParserHandler());

 

解析xml文件

xmlReader.parse("book.xml");

 

看一个关于SAX解析XML文件的简单示例:

Book.xml

 

<?xmlversion="1.0"encoding="UTF-8"standalone="no"?><book>

<bookname>as</bookname>

<bookprice>a</bookprice>

<author>a</author>

<publisher>lijizh1013</publisher>

 

</book>

 

ReadSAX.java

 

package dtd;

 

import java.io.IOException;

import java.net.ContentHandler;

import javax.xml.parsers.ParserConfigurationException;

import javax.xml.parsers.SAXParser;

import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;

import org.xml.sax.Locator;

import org.xml.sax.SAXException;

import org.xml.sax.XMLReader;

import org.xml.sax.helpers.DefaultHandler;

 

publicclass ReadSAX {

     publicstaticvoid main(String[] args)throwsParserConfigurationException, SAXException, IOException {

     //使用SAXParserFactory创建SAX解析工厂

     SAXParserFactory spf = SAXParserFactory.newInstance();

     //通过SAX解析工厂得到解析器对象

     SAXParser sp = spf.newSAXParser();

     //通过解析器对象得到一个XML的读取器

     XMLReader xmlr = sp.getXMLReader();

     //设置读取器的事件处理器

     xmlr.setContentHandler(newNewContentHanlder());

     //解析xml文件 

     xmlr.parse("src/dtd/Book.xml");

    }

}

//NewContentHanlder继承了实现了ContentHanlder接口的类DefaultHandler

class NewContentHanlderextends DefaultHandler{

 

    @Override

    //实现里面的开始元素的方法

    publicvoid startElement(String uri, String localName, String qName,

           Attributes attributes)throws SAXException {

       System.out.println("<"+qName+">");

    }

   

    @Override

    //实现里面的关于文本操作的方法

    publicvoid characters(char[] ch, int start,int length)

           throws SAXException {

       System.out.println(new String(ch,start,length));

    }

 

    @Override

    //实现里面的结束元素的方法

    publicvoid endElement(String uri, String localName, String qName)

           throws SAXException {

       System.out.println("<"+qName+">");

    }

 

   

   

}

 

我们还可以使用其他包下相关方法完成对于XML文件的解析,这里主要讲的是使用Jaxp包下的相关方法实现对xml文件的解析,对于其他的解析方法,我们在以后也会提到,希望大家关注!