SAX解析器解析XML文件

利用SAX解析器解析XML文件需要经过以下步骤: 

    1). 实例化一个SAXParserFactory对象:

        SAXParserFactory factory = SAXParserFactory.newInstance();


    2). 通过factory获得一个SAXParser对象,即SAX解析器:

        SAXParser saxParser = factory.newSAXParser();


    3). saxParser对象调用parse方法解析XML文件:

         saxParser.parse(File file,DefaultHandler dh);


    4). 编写继承DefaultHandler的子类


    DefaultHandler的子类代码:

      

import java.util.HashMap;
import java.util.Map;


import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;


public class XmlHandler extends DefaultHandler{
	
	//用来临时存储从Xml中解析出来的字符串
	private StringBuffer buffer = new StringBuffer();
	
	//用来存储从Xml中读取到的字符串,键:Xml 文件中的元素名     值:元素值
	//例:<driverClass>com.mysql.jdbc.Driver</driverClass> 
	//键:driverClass 值:com.mysql.jdbc.Driver
	private Map<String, String> map = new HashMap<String, String>();
	
	/**
	 * @return:返回存储着从 xml 文件中读取到的信息的 Map 容器
	 */
	public Map<String, String> getMap(){
		return map;
	}
	
	@Override
	public void startElement(String arg0, String arg1, String arg2, Attributes arg3) throws SAXException {
		//遇到元素的开头时,清空字符数组
		buffer.delete(0, buffer.length());
	}
	
	
	@Override
	public void characters(char[] arg0, int arg1, int arg2) throws SAXException {
		//读到元素值时,往字符数组里添加该元素值
		buffer.append(arg0, arg1, arg2);
	}
	
	@Override
	public void endElement(String arg0, String arg1, String arg2) throws SAXException {
		//把该字符数组放到 map 容器里,args 参数为元素名
		map.put(arg2, buffer.toString().trim());
		
	}
}

    解析主类代码:

import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.SAXException;

public class XmlParser{
	private static Map<String, String> map = null;
	
	public static boolean parser(String xmlPath) {
		boolean flag = false;
		
		//获取当前工程的 classpath 的 绝对路径uri
		String basePath = Thread.currentThread().getContextClassLoader().getResource("").getPath();
		//basePath = /D:/Eclipse/eclipse/SalaryManager/build/classes/
		
		//构建绝对路径
		xmlPath = basePath + xmlPath;
		try {
			//定义工厂 API,使应用程序能够配置和获取基于 SAX 的解析器以解析 XML 文档
			SAXParserFactory factory = SAXParserFactory.newInstance();
			
			//使用当前配置的工厂参数创建 SAXParser 的一个新实例。
			SAXParser saxParser = factory.newSAXParser();
			
			File file = new File(xmlPath);
			XmlHandler handler = new XmlHandler();
			
			//使用指定的  Handler 将指定文件的内容解析为 XML
			saxParser.parse(file, handler);
			map = handler.getMap();
			flag = true;
		} catch (ParserConfigurationException e) {
			
			e.printStackTrace();
		} catch (SAXException e) {
			
			e.printStackTrace();
		}catch (IOException e) {
			
			e.printStackTrace();
		}
		return flag;
	}
	
	public static Map<String, String> getParserMap(){
		return map;
	}
}


猜你喜欢

转载自blog.csdn.net/Mrs_Yu/article/details/79888747