1.SAX:解析Simple API for XML
SAX 是一个 event-driven serial-access 类 型的 XML 处理机制。
event-driven : SAX 提供 面向 elements, text 和 comments 等 不同 事件的处理 方法,当解析器 读 取 XML 数据 时 就会 调 用 这 些方法。
serial-access : SAX 工作起来有点像一个 连续 的 I/O 流,能 实时 的 传 送和接收数据,它不会去构造 XML 的 树 形 结 构,所以只需要很少的内存。
当然 这 在另一方面 , 也 导 致了你不能退回到早前 读 取的一个 element 或者跳到后面 还 未 读 到的 element 。
2. When To Use SAX
因 为 SAX 是 处 理 XML 文件的最快的,内存需求最小的 解析器 ,所以当你只需要 简单 地 读取 数据, 好 让 你的程序运行 这 些数据的 时候 ,SAX 是很好的 选择 。
因此, SAX 常被用于 servlet 和面向 网络 编程的存取 XML 文件。
3.自定义 SAX 解析器
以下是自定义一个SAX解析器的详细方法:
1.继承DefaultHandler
因为DefaultHandler同时实现了EntityResolver,DTDHandler,ContentHandler和ErrorHandler四个接口,
这样你就可以在你的XML解析器中调用或重写这四个接口中定义的面向不同事件的处理方法。
2.创建简单的parser(Validating parser)
创建一个parser,并使用Schema或DTD对XML文件进行校验
3.ContentHandler
1)处理Document 事件的method
- startDocument: 开始解析XML文件,此方法只会被调用一次
- endDocument: 解析XML文件结束
2)处理Element 事件的method
- startElement: 开始解析XML文件的一个元素,在此方法中,可以获得该元素的属性和其对应的value值
- endElement: 解析该元素完毕
3)处理Character 事件的method
- characters: 用于解析元素中的字符数据
4)其他method
- setDocumentLocator: 该方法只在解析开始前被调用一次。用户可获得当前所解析的XML文件的位置和public identifier等信息。
- ignorableWhitespace: 使用DTD校验时,通过重写此方法,用户可以查看XML中哪些地方存在whitespace
- processingInstruction: 通过此方法可以获得XML中定义的命令(target)和命令所处理的内容(data)
4.ErrorHandler
解析XML时发生的异常包括三种:a fatal error, an error, and a warning.
-fatalError(SAXParseException): 用于处理致命error
-error(SAXParseException): 用于处理非致命error,发生于对XML进行校验时。默认是被忽略的。由于当一个XML发生校验错误时,用户可能不希望再解析下去了,
此时,可以将此类异常自定义为致命error抛出。
-warning(SAXParseException): 用于处理警告。默认是被忽略的。用户可以通过自定义的方式打印出异常具体的发生地点和信息。
5.DTDHandler
事件处理method
-notationDecl: Receive notification of a notation declaration event.
-unparsedEntityDecl: Receive notification of an unparsed entity declaration event.
-resolveEntity: 该方法用于将public ID (URN)装换为system ID (URL),返回一个InputSource object。
7.LexicalHandler
SAX中使用org.xml.sax.ext.LexicalHandler来处理comments, CDATA sections和references。]
8.方法参数代表类型
startElement(String namespaceURI,String localName,String fullName,Attributes attributes){ }
namespaceURI——命名空间
localName——标签名称
fullName——带命名空间的标签名
Attributes——存放该标签的所有属性
characters(char[ ] ch,int start ,int length)
ch——当前读到的TextNode字节数组
start——字节开始的位置,如果要读取全部,那就是从0开始
SAX 是一个 event-driven serial-access 类 型的 XML 处理机制。
event-driven : SAX 提供 面向 elements, text 和 comments 等 不同 事件的处理 方法,当解析器 读 取 XML 数据 时 就会 调 用 这 些方法。
serial-access : SAX 工作起来有点像一个 连续 的 I/O 流,能 实时 的 传 送和接收数据,它不会去构造 XML 的 树 形 结 构,所以只需要很少的内存。
当然 这 在另一方面 , 也 导 致了你不能退回到早前 读 取的一个 element 或者跳到后面 还 未 读 到的 element 。
2. When To Use SAX
因 为 SAX 是 处 理 XML 文件的最快的,内存需求最小的 解析器 ,所以当你只需要 简单 地 读取 数据, 好 让 你的程序运行 这 些数据的 时候 ,SAX 是很好的 选择 。
因此, SAX 常被用于 servlet 和面向 网络 编程的存取 XML 文件。
3.自定义 SAX 解析器
以下是自定义一个SAX解析器的详细方法:
1.继承DefaultHandler
因为DefaultHandler同时实现了EntityResolver,DTDHandler,ContentHandler和ErrorHandler四个接口,
这样你就可以在你的XML解析器中调用或重写这四个接口中定义的面向不同事件的处理方法。
2.创建简单的parser(Validating parser)
创建一个parser,并使用Schema或DTD对XML文件进行校验
3.ContentHandler
1)处理Document 事件的method
- startDocument: 开始解析XML文件,此方法只会被调用一次
- endDocument: 解析XML文件结束
2)处理Element 事件的method
- startElement: 开始解析XML文件的一个元素,在此方法中,可以获得该元素的属性和其对应的value值
- endElement: 解析该元素完毕
3)处理Character 事件的method
- characters: 用于解析元素中的字符数据
4)其他method
- setDocumentLocator: 该方法只在解析开始前被调用一次。用户可获得当前所解析的XML文件的位置和public identifier等信息。
- ignorableWhitespace: 使用DTD校验时,通过重写此方法,用户可以查看XML中哪些地方存在whitespace
- processingInstruction: 通过此方法可以获得XML中定义的命令(target)和命令所处理的内容(data)
4.ErrorHandler
解析XML时发生的异常包括三种:a fatal error, an error, and a warning.
-fatalError(SAXParseException): 用于处理致命error
-error(SAXParseException): 用于处理非致命error,发生于对XML进行校验时。默认是被忽略的。由于当一个XML发生校验错误时,用户可能不希望再解析下去了,
此时,可以将此类异常自定义为致命error抛出。
-warning(SAXParseException): 用于处理警告。默认是被忽略的。用户可以通过自定义的方式打印出异常具体的发生地点和信息。
5.DTDHandler
事件处理method
-notationDecl: Receive notification of a notation declaration event.
-unparsedEntityDecl: Receive notification of an unparsed entity declaration event.
6.EntityResolver
事件处理method-resolveEntity: 该方法用于将public ID (URN)装换为system ID (URL),返回一个InputSource object。
7.LexicalHandler
SAX中使用org.xml.sax.ext.LexicalHandler来处理comments, CDATA sections和references。]
8.方法参数代表类型
startElement(String namespaceURI,String localName,String fullName,Attributes attributes){ }
namespaceURI——命名空间
localName——标签名称
Attributes——存放该标签的所有属性
characters(char[ ] ch,int start ,int length)
ch——当前读到的TextNode字节数组
start——字节开始的位置,如果要读取全部,那就是从0开始
length——当前TextNode的长度
附sax解析jar包: