SAX 是一个 event-driven serial-access 类 型的 XML 处理机制。
event-driven : SAX 提供 面向 elements, text 和 comments 等 不同 事件的处理 方法,当解析器 读 取 XML 数据 时 就会 调 用 这 些方法。
serial-access : SAX 工作起来有点像一个 连续 的 I/O 流,能 实时 的 传 送和接收数据,它不会去构造 XML 的 树 形 结 构,所以只需要很少的内存。当然 这 在另一方面 , 也 导 致了你不能退回到早前 读 取的一个 element 或者跳到后面 还 未 读 到的 element 。
因 为 SAX 是 处 理 XML 文件的最快的,内存需求最小的 解析器 ,所以当你只需要 简单 地 读取 数据,好 让 你的程序运行 这 些数据的 时候 ,SAX 是很好的 选择 。因此, SAX 常被用于 servlet 和面向 网络 编程的存取 XML 文件。
SAX 解析器存在与 JDK 如下的包中:
SAX API 概述
附件2是 SAX API 的略图。
SAX 解析器包含了一个 SAXReader 实例,当解析器的 parse 方法被调用时, reader 会调用对不同事件的处理方法 ( event-driven ) 。
这些方法在以下四种 handler 中被定义。用户可以在自定义的解析器中重写这些方法。
DefaultHandler :适配了上面的四个接口,可用于不同事件的处理
以下是自定义一个SAX解析器的详细方法:
因为DefaultHandler同时实现了EntityResolver,DTDHandler,ContentHandler和ErrorHandler四个接口,
这样你就可以在你的XML解析器中调用或重写这四个接口中定义的面向不同事件的处理方法。
创建一个parser,并使用Schema或DTD对XML文件进行校验
// Use an instance of ourselves as the SAX event handler DefaultHandler handler = new MyHandler(); // Use the validating parser SAXParserFactory factory = SAXParserFactory.newInstance(); factory.setValidating(true); try { // Parse the input SAXParser saxParser = factory.newSAXParser(); saxParser.parse( new File("XXX"), handler ); } catch (Throwable t) { t.printStackTrace(); }
- startDocument: 开始解析XML文件,此方法只会被调用一次
- endDocument: 解析XML文件结束
- startElement: 开始解析XML文件的一个元素,在此方法中,可以获得该元素的属性和其对应的value值
- endElement: 解析该元素完毕
- characters: 用于解析元素中的字符数据
注:当XML文档中没有使用DTD进行校验时,当遇到whitespace时,该方法也会被调用。
- setDocumentLocator: 该方法只在解析开始前被调用一次。用户可获得当前所解析的XML文件的位置和public
identifier等信息。
- ignorableWhitespace: 使用DTD校验时,通过重写此方法,用户可以查看XML中哪些地方存在whitespace
- processingInstruction: 通过此方法可以获得XML中定义的命令(target)和命令所处理的内容(data)
解析XML时发生的异常包括三种:a fatal error, an error, and a warning.
-fatalError(SAXParseException): 用于处理致命error
-error(SAXParseException): 用于处理非致命error,发生于对XML进行校验时。默认是被忽略的。由于当一个XML
发生校验错误时,用户可能不希望再解析下去了,此时,可以将此类异常自定义为致命error抛出。
-warning(SAXParseException): 用于处理警告。默认是被忽略的。用户可以通过自定义的方式打印出异常具体
的发生地点和信息。
事件处理method
-notationDecl: Receive notification of a notation declaration event.
-unparsedEntityDecl: Receive notification of an unparsed entity declaration event.
事件处理method
-resolveEntity: 该方法用于将public ID (URN)装换为system ID (URL),返回一个InputSource object。
SAX中使用org.xml.sax.ext.LexicalHandler来处理comments, CDATA sections和references。
// Use an instance of ourselves as the SAX event handler DefaultHandler handler = new MyHandler(); // Use the validating parser SAXParserFactory factory = SAXParserFactory.newInstance(); factory.setValidating(true); try { // Parse the input SAXParser saxParser = factory.newSAXParser(); XMLReader xmlReader = saxParser.getXMLReader(); xmlReader.setProperty("http://xml.org/sax/properties/lexical-handler",handler); saxParser.parse( new File("XXX"), handler ); } catch (Throwable t) { t.printStackTrace(); }
-comment(String comment): 解析XML文件中的注释
-startCDATA(), endCDATA(): Tells when a CDATA section is starting and ending, which tells your
application what kind of characters to expect the next time characters()is called
-startEntity(String name), endEntity(String name): Gives the name of a parsed entity
-startDTD(String name, String publicId, String systemId), endDTD(): Tells when a DTD is being
processed, and identifies it
附件1(我将官网上的sample进行整合,基本上囊括了上述所有的知识点)用于解析一个XML文件,并将其详细信息(片段如下)打印出来。