关于xml学习(三)—— JAXP-SAX解析

来源:互联网 发布:淘宝网汽车坐垫套全包 编辑:程序博客网 时间:2024/05/01 12:54


SAX解析原理:

SAX 是事件驱动的XML处理方法
逐行扫描文档,一边扫描一边解析
SAX仅需实现部分接口时扩展org.xml.sax.helpers.DefaultHandler
DefaultHandler类默认的空实现

使用SAX方式解析XML:
1)使用SAXParserFactory创建SAX解析工厂
SAXParserFactoryspf =SAXParserFactory.newInstance();
2)通过SAX解析工厂得到解析器对象 
SAXParser sp = spf.newSAXParser();
3)通过解析器对象得到一个XML的读取器
XMLReaderxmlReader =sp.getXMLReader();
4)设置读取器的事件处理器 
xmlReader.setContentHandler(newXMLContentHandler());
5)解析xml文件 
xmlReader.parse("book.xml");

SAX的事件驱动模型:

 startDocument:文档开始
 startElement:元素开始

uri名称空间URI,如果元素没有则为空字符串。
localName本地名称,如果没有名称空间,则为空字符串。
qName限定的名称
attributes:附加到元素的属性。
characters:文本
通过new String(ch,start,length)获得字符串

 endElement:元素结束
 endDocument:文档结束

实例:
SAXTest.java:
package com.example.jaxp.SAX;import javax.xml.parsers.SAXParser;import javax.xml.parsers.SAXParserFactory;import org.xml.sax.helpers.DefaultHandler;public class SAXTest {public static void main(String[] args) throws Exception {// 获取SAX解析工厂实例SAXParserFactory factory = SAXParserFactory.newInstance();// 获取SAX解析器SAXParser parser = factory.newSAXParser();DefaultHandler dh = new MyDefaultHandler();// 解析xml文档parser.parse("book.xml", dh);}}

MyDefaultHandler.java:
package com.example.jaxp.SAX;import org.xml.sax.Attributes;import org.xml.sax.SAXException;import org.xml.sax.helpers.DefaultHandler;public class MyDefaultHandler extends DefaultHandler {    /**     * 如果xml文件使用了schema约束 <xs:element>     *   * uri:schema -- targetNameSpace        *   * localName--element     *   * qName---xs:element     * 如果不使用     *   * uri:null     *   * localName:null     *   * qName : element     *        * Attributes:当前元素的所有的属性的集合     */             @Overridepublic void startDocument() throws SAXException {System.out.println("文档的开始");}@Overridepublic void startElement(String uri, String localName, String qName,Attributes attributes) throws SAXException {System.out.println("元素开始:" + qName + "****" + attributes.getValue("id"));}@Overridepublic void characters(char[] ch, int start, int length)throws SAXException {System.out.println(new String(ch, start, length));}@Overridepublic void endElement(String uri, String localName, String qName)throws SAXException {System.out.println("元素结束:" + qName);}@Overridepublic void endDocument() throws SAXException {System.out.println("文档的开始");}}

运行结果:







0 0