SAX解析工具- Sun公司提供的。内置在jdk中。org.xml.sax.*
SAX核心的API:
SAXParser类: 用于读取和解析xml文件对象
parse(File f, DefaultHandler dh)方法: 解析xml文件
参数一: File:表示 读取的xml文件。
参数二: DefaultHandler: SAX事件处理程序。使用DefaultHandler的子类
DefaultHandler类的API:
void startDocument() : 在读到文档开始时调用
void endDocument() :在读到文档结束时调用
void startElement(String uri, String localName, String qName, Attributes attributes) :读到开始标签时调用
void endElement(String uri, String localName, String qName) :读到结束标签时调用
void characters(char[] ch, int start, int length) : 读到文本内容时调用
//1.创建SAXParser对象 SAXParser parser=SAXParserFactory.newInstance().newSAXParser(); //2.调用parse方法 parser.parse(new File("./src/contact.xml"), new MyDefaultHandler());
Demo01.java
package com.rk.xml.j_sax; import java.io.File; import javax.xml.parsers.SAXParserFactory; import javax.xml.parsers.SAXParser; /** * 第一个SAX读取xml文件程序 * @author RK * */ public class Demo01 { public static void main(String[] args) throws Exception { //1.创建SAXParserFactory工厂 SAXParserFactory parserFactory = SAXParserFactory.newInstance(); //2.创建SAXParser对象 SAXParser parser = parserFactory.newSAXParser(); //3.调用parse方法 /** * 参数一: xml文档 * 参数二: DefaultHandler的子类 */ parser.parse(new File("./src/animals.xml"),new MyDefaultHandler01()); System.out.println("执行结束!"); } }
MyDefaultHandler01.java
package com.rk.xml.j_sax; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; /** * SAX处理程序(如何解析xml文档) * @author RK * */ public class MyDefaultHandler01 extends DefaultHandler { /** * 开始文档时调用 */ @Override public void startDocument() throws SAXException { System.out.println("MyDefaultHandler.startDocument()"); } /** * 结束文档时调用 */ @Override public void endDocument() throws SAXException { System.out.println("MyDefaultHandler.endDocument()"); } /** * 开始标签时调用 * @param qName: 表示开始标签的标签名 * @param attributes: 表示开始标签内包含的属性列表 */ @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { System.out.println("MyDefaultHandler.startElement()==>" + qName); } /** * 结束标签时调用 * @param qName: 结束标签的标签名称 */ @Override public void endElement(String uri, String localName, String qName) throws SAXException { System.out.println("MyDefaultHandler.endElement()==>" + qName); } /** * 读到文本内容的时调用 * @param ch: 表示当前读完的所有文本内容 * @param start: 表示当前文本内容的开始位置 * @param length: 表示当前文本内容的长度 */ @Override public void characters(char[] ch, int start, int length) throws SAXException { //得到当前文本内容 String content = new String(ch,start,length); System.out.println("MyDefaultHandler.characters()==>" + content + "==>End"); } }
Demo02.java
package com.rk.xml.j_sax; import java.io.File; import javax.xml.parsers.SAXParserFactory; import javax.xml.parsers.SAXParser; public class Demo02 { public static void main(String[] args) throws Exception { //1.创建SAXParserFactory工厂 SAXParserFactory parserFactory = SAXParserFactory.newInstance(); //2.创建SAXParser对象 SAXParser parser = parserFactory.newSAXParser(); //3.创建Handler对象,并调用parse方法 MyDefaultHandler02 handler = new MyDefaultHandler02(); parser.parse(new File("./src/animals.xml"), handler); //4.结果输出 String content = handler.getContent(); System.out.println(content); } }
MyDefaultHandler02.java
package com.rk.xml.j_sax; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; /** * SAX处理器程序 * @author RK * */ public class MyDefaultHandler02 extends DefaultHandler { //存储xml文档信息 private StringBuilder sb = new StringBuilder(); //获取xml信息 public String getContent() { return sb.toString(); } /** * 开始标签 */ @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { sb.append("<" + qName); //判断是否有属性 if(attributes != null) { for(int i=0;i<attributes.getLength();i++) { //得到属性名称 String attrName = attributes.getQName(i); //得到属性值 String attrValue = attributes.getValue(i); sb.append(" " + attrName + "=\"" + attrValue + "\""); } } sb.append(">"); } /** * 结束标签 */ @Override public void endElement(String uri, String localName, String qName) throws SAXException { sb.append("</" + qName + ">"); } /** * 文本内容 */ @Override public void characters(char[] ch, int start, int length) throws SAXException { //得到当前读取的文本 String content = new String(ch,start,length); sb.append(content); } }
Demo03.java
package com.rk.xml.j_sax; import javax.xml.parsers.SAXParserFactory; import javax.xml.parsers.SAXParser; import org.xml.sax.XMLReader; public class Demo03 { public static void main(String[] args) throws Exception { SAXParserFactory parserFactory = SAXParserFactory.newInstance(); SAXParser parser = parserFactory.newSAXParser(); XMLReader reader = parser.getXMLReader(); reader.setContentHandler(new MyContentHandler03()); reader.parse("./src/animals.xml"); } }
MyContentHandler03.java
package com.rk.xml.j_sax; import org.xml.sax.Attributes; import org.xml.sax.ContentHandler; import org.xml.sax.Locator; import org.xml.sax.SAXException; public class MyContentHandler03 implements ContentHandler { @Override public void setDocumentLocator(Locator locator) { System.out.println("MyContentHandler03.setDocumentLocator()"); } @Override public void startDocument() throws SAXException { System.out.println("MyContentHandler03.startDocument()" + "文档开始"); } @Override public void endDocument() throws SAXException { System.out.println("MyContentHandler03.endDocument()" + "文档结束"); } @Override public void startPrefixMapping(String prefix, String uri) throws SAXException { System.out.println("MyContentHandler03.startPrefixMapping()"); } @Override public void endPrefixMapping(String prefix) throws SAXException { System.out.println("MyContentHandler03.endPrefixMapping()"); } @Override public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException { System.out.println("MyContentHandler03.startElement()" + "==>StartELement:" + qName); } @Override public void endElement(String uri, String localName, String qName) throws SAXException { System.out.println("MyContentHandler03.endElement()" + "==>EndElement:" + qName); } @Override public void characters(char[] ch, int start, int length) throws SAXException { String content = new String(ch,start,length); System.out.println("MyContentHandler03.characters()" + "==>characters:" + content); } @Override public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException { System.out.println("MyContentHandler03.ignorableWhitespace()"); } @Override public void processingInstruction(String target, String data) throws SAXException { System.out.println("MyContentHandler03.processingInstruction()"); } @Override public void skippedEntity(String name) throws SAXException { System.out.println("MyContentHandler03.skippedEntity()"); } }
以JAXP读取XML的DOM解析方法和SAX解析方法经常进行对比,如下图:
DOM解析模型如下:
SAX解析模型如下: