JavaEE XML SAX解析

瘦欲@ 提交于 2019-12-09 11:25:31

SAX解析XML

@author ixenos

 

 

 

SAX解析工具


 

SAX解析工具-  Sun公司提供的。内置在jdk中。org.xml.sax.*

 

核心的API:

SAXParser类: 用于读取和解析xml文件对象

parse(File f, DefaultHandler dh)方法: 解析xml文件

 

参数一: File:表示 读取的xml文件。

参数二: DefaultHandler: SAX事件处理程序。使用DefaultHandler的子类

例如:{

1.创建SAXParser对象

SAXParser parser=SAXParserFactory.newInstance().newSAXParser();

2.调用parse方法

parser.parse(new File("./src/contact.xml"), new MyDefaultHandler());

}              [一个类继承class 类名(extends 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)  : 读到文本内容时调用,ch是所有Text内容的字符数组,用strat和length确定有意义的字符(非换行符)

 

 

 

 

SAX解析常用API


 

 

1、

SAXParserFactory factory = SAXParserFactory.newInstance();

Parser.parse(“books.xml”, handler);

 

2、

//handler参数是DefaultHandler对象

DefaultHandler handler = new SAXParserHandler();

 

3、

//DefaultHandler最重要的几个回调方法

startDocumentendDocument分别在文档开始和结束时各调用一次

startElementendElement每当遇到起始或终止标签时调用

characters在每当遇到标签中间的字符数据时调用(非换行符的Text)

 

4、

//DefaultHandler实现类

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
/**
 * SAX处理程序(如何解析xml文档)
 * @author APPle
 *
 */
public class MyDefaultHandler extends DefaultHandler {

	/**
	 * 开始文档时调用
	 */
	@Override
	public void startDocument() throws SAXException {
		System.out.println("MyDefaultHandler.startDocument()");
	}

	/**
	 * 开始标签时调用
	 * @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: 表示当前文本内容的长度
	 * char[](                                       张三              20)   100
	 *                              98 2
	 */
	@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);
	}

	/**
	 * 结束文档时调用
	 */
	@Override
	public void endDocument() throws SAXException {
		System.out.println("MyDefaultHandler.endDocument()");
	}

}

  

示例二:

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
/**
 * SAX处理器程序
 * @author ixenos
 */
public class MyDefaultHandler2 extends DefaultHandler {
	//存储xml文档信息
	private StringBuffer sb = new StringBuffer();
	
	//获取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 characters(char[] ch, int start, int length)
			throws SAXException {
		//得到当前读取的文本
		String content = new String(ch,start,length);
		sb.append(content);
	}
	
	/**
	 * 结束标签
	 */
	@Override
	public void endElement(String uri, String localName, String qName)
			throws SAXException {
		sb.append("</"+qName+">");
	}
}

  

示例三:

package gz.itcast.c_sax;

import java.util.ArrayList;
import java.util.List;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
/**
 * SAX处理程序
 * @author APPle
 *
 */
public class MyDefaultHandler3 extends DefaultHandler {
	//存储所有联系人对象
	private List<Contact> list = new ArrayList<Contact>();

	public List<Contact> getList(){
		return list;
	}
	//保存一个联系人信息
	private Contact contact;
	/**
	 * 思路:
	 * 	1)创建Contact对象
	 *  2)把每个contact标签内容存入到Contact对象
	 *  3)把Contact对象放入List中
	 */
	//用于临时存储当前读到的标签名
	private String curTag;

	@Override
	public void startElement(String uri, String localName, String qName,
			Attributes attributes) throws SAXException {
		curTag = qName;
		//读取到contact的开始标签创建Contact对象
		if("contact".equals(qName)){
			contact = new Contact();

			//设置id值
			contact.setId(attributes.getValue("id"));
		}
	}

	@Override
	public void characters(char[] ch, int start, int length)
			throws SAXException {
		//当前文本内容
		String content = new String(ch,start,length);

		if("name".equals(curTag)){
			contact.setName(content);
		}

		if("age".equals(curTag)){
			contact.setAge(content);
		}

		if("phone".equals(curTag)){
			contact.setPhone(content);
		}

		if("email".equals(curTag)){
			contact.setEmail(content);
		}

		if("qq".equals(curTag)){
			contact.setQq(content);
		}
	}

	@Override
	public void endElement(String uri, String localName, String qName)
			throws SAXException {
		//设置空时为了避免空格换行设置到对象的属性中
		curTag = null;
		//读到contact的结束标签放入List中
		if("contact".equals(qName)){
			list.add(contact);
		}
	}
}

  

 

 

5、基于事件

SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
SAXParserHandler handler = new SAXParserHandler();

parser.parse("books.xml", handler);

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!