天天看点

用SAX2解析xml

sax2是The Simple API for xml的意思,是一种解析xml的方式。解析xml主要有二种方式,一个是dom,比较常用,解析完成以后再内存形成一个结构,另外一个方式就是一种事件解析方式,就是在解析到一定的内容抛出事件,继续向后处理,xml读取完成,也就解析完成,xml的内容并不存入内存。

Java API for XML Processing (JAXP) 对于xml解析进行了一层抽象,为了防止代码中混淆特定厂家的代码,jaxp对于xml的解析进行了抽象,他本身只是一个抽象层,不具有解析xml的能力,但是可以有第三方独立的机构进行代码的开发,这样的解析器很多,比如Sun的Crimson 还有apache的Xerces 等等

对于javax.xml.parsers下的类进行一个说明

DocumentBuilder

定义 API, 使其从 XML 文档获取 DOM 文档实例。使用此类,应用程序员可以从 XML 获取一个

Document

此类的实例可以从

DocumentBuilderFactory.newDocumentBuilder()

方法获取。获取此类的实例之后,将可以从各种输入源解析 XML。这些输入源为 InputStreams、Files、URL 和 SAX InputSources。

注意,此类重用了 SAX API 中的一些类。这并不要求底层 DOM 实现的实现者使用 SAX 解析器将 XML 文档解析为

Document

。它仅要求该实现使用这些现有的 API 与应用程序交流。

DocumentBuilderFactory

定义工厂 API,使应用程序能够从 XML 文档获取生成 DOM 对象树的解析器

SAXParserFactory

定义工厂 API,使应用程序能够配置和获取基于 SAX 的解析器以解析 XML 文档。

SAXParser

定义包装

XMLReader

实现类的 API。在 JAXP 1.0 中,此类包装

Parser

接口,但是此接口由

XMLReader

取代。为了便于过渡,此类继续支持相同的名称和接口,并支持新方法。 此类的实例可以从

SAXParserFactory.newSAXParser()

方法获得。获取此类的实例之后,将可以从各种输入源解析 XML。这些输入源为 InputStream、File、URL 和 SAX InputSource。

此静态方法根据系统属性设置创建新的工厂实例,如果未定义属性,则使用平台默认值。

控制创建哪个工厂实现的系统属性命名为

"javax.xml.parsers.SAXParserFactory"

。此属性命名一个类,该类为此抽象类的具体子类。如果未定义属性,将使用默认的平台。

由于内容由基础解析器解析,因此将调用给定

HandlerBase

DefaultHandler

的方法。

包装基础实现的此类的实现程序可以考虑使用

ParserAdapter

类,从而使其 SAX1 实现最初在此修订类下工作

其中包含了二个异常类

ParserConfigurationException

指示一个严重的配置错误。

FactoryConfigurationError

当解析器工厂的配置存在问题时抛出该异常。当找不到系统属性中指定的解析器工厂的类时,或者该类不能被实例化时,通常抛出此错误。

刚才说到jaxp里面都是一个抽象层,他都是依靠第三方的解析器进行的xml的解析,那么修改配置也成为一种必然需求,其实更改 JAXP 工厂类使用的解析器很容易。更改解析器实际上意味着更改解析器工厂,因为所有

SAXParser

DocumentBuilder

实例都来自这些工厂。工厂确定加载哪个解析器,所以必须更改工厂。要更改

SAXParserFactory

接口的实现,请设置 Java 系统特性

javax.xml.parsers.SAXParserFactory

。如果未定义此特性,则返回默认实现(不管开发商指定哪个解析器)。同一规则适用于所使用的

DocumentBuilderFactory

实现。在这种情况下,将会查询

javax.xml.parsers.DocumentBuilderFactory

系统特性。

sax的处理代码风格主要如下二种:

1.           

            // Get SAX Parser Factory

            SAXParserFactory factory = SAXParserFactory.newInstance();

            // Turn on validation, and turn off namespaces

            factory.setValidating(true);

            factory.setNamespaceAware(false);

            SAXParser parser = factory.newSAXParser();

            parser.parse(new File(args[0]), new MyHandler());

2.org.xml.sax.XMLReader parser = saxParser.getXMLReader();

// Use the underlying parser

parser.setContentHandler(myContentHandlerInstance);

parser.setErrorHandler(myErrorHandlerInstance);

parser.parse(new org.xml.sax.InputSource(args[0]));