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());


1、读取XML


1.1、展示DefaultHandler的各个事件处理函数

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");
	}

}



1.2、将XML重新输出的示例

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);
	}

}



1.3、更进一步深入:XMLReader和ContentHandler

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解析方法经常进行对比,如下图:

wKioL1c3CAvh-1NOAABFAK--oUE558.png

DOM解析模型如下:

wKiom1c3B2rDSxJjAABPNNYwMEA596.jpg

SAX解析模型如下:

wKioL1c3CGWy6iMzAABeoQklS-U615.jpg



2、思维导图

wKiom1c3BuKj2Z4IAAHGMNgO1_Y609.png