Java SAX 解析
DOM 解析参考:Java DOM 解析
# 无 Validation
SAXParserFactory fact = SAXParserFactory.newInstance(); fact.setNamespaceAware(true); SAXParser parser = fact.newSAXParser(); XMLReader reader = parser.getXMLReader(); ContentHandler handler = ...; ErrorHandler errorHandler = ...; reader.setContentHandler(handler); reader.setErrorHandler(errorHandler); URL url = ...; reader.parse(url.toString());
o 主要API:
- javax.xml.parsers.SAXParserFactory
- javax.xml.parsers.SAXParser
- org.xml.sax.XMLReader
- org.xml.sax.ContentHandler
- org.xml.sax.ErrorHandler
- org.xml.sax.DefaultHandler: 实现了 ContentHandler 和 ErrorHandler 接口
o ContentHandler
主要的方法
- startDocument
- endDocument
- startElement
- characters
文本(包括空白)、CDATA 都会以 characters() 通知
文本中的 Entity会被替换,如 <替换为 <
o ErrorHandler
ErrorHandler 接口定义了3个回掉方法:
- warning:警告,但合法
- error:Validation 失败时
- fatalError:XML 不是 well formed
warning()/error() 只在启用了 Validation 时才会发生
3个方法都可以抛出 SaxException。如果抛出 SaxException 则 SAX 解析过程终止
# DTD Validation
要启用 DTD Validation,调用
SAXParserFactory.setValidating(true);
解析器会根据XML文档中 DOCTYPE 声明中的 URI 去加载 DTD。如果 DTD文件找不到,SaxParser.parse() 会抛出 IOException
如果解析的XML来自 InputStream,可以使用 SaxParser.parse(InputSource),其参数类型 InputSource 可包装一个 InputStream
通过以下方法对其进行设置:
- setSystemId():设置 DOCTYPE SYSTEM URI,对应 <!DOCTYPE root-element SYSTEM "URI">
- setPublicId():设置 DOCTYPE PUBLIC URI,对应 <!DOCTYPE root-element PUBLIC "name" "URI">
- setEncoding()