JAVA SAX解析XML文档

SAX

SAX(simple API for XML)是一种XML解析的方法,相比于DOM,SAX的解析更有效更快。

解析步骤

①获取解析工厂
②从解析工厂获取解析容器
③编写处理器
④加载Document处理器
⑤进行解析

详细步骤

①此解析模式使用了工厂设计模式,所以先需获取工厂
工厂全路径为:javax.xml.parsers.SAXParserFactory
另外还使用了单例设计模式,所以需通过静态方法newInstance()获取对象。

SAXParserFactory saxFactory = SAXParserFactory.newInstance()

②通过工厂获取解析容器

SAXParser myParser = saxFactory.newSAXParser()

③编写处理器是整个解析过程的重点
编写一个类继承import org.xml.sax.helpers.DefaultHandler类
并重写startDocument(),startElement(),characters()等方法进行解析

方法 作用
startDocument() 编写解析整个文档前需执行的操作
startElement() 编写解析每个元素前需执行的操作(此时可解析元素的属性)
characters() 编写解析元素所包含内容时所执行的操作
endElement() 编写每个元素解析完成之后需执行的操作
endDocument() 编写整个文档解析完成之后需执行的操作

解析文档的实例:
Ps:此处的文档以我上一篇博客中编写的文档为例,结果使用容器进行存储

/**
 * 重写处理器
 * @author 81493
 *
 */
class MyHandler extends DefaultHandler{
 	//联系单
 	private List<Map<String,String>> contacts;
 	//标记正在解析的元素
 	private String sign;
 	//标记是否解析
 	private boolean isAnaly;
 	//联系人 
 	private Map<String, String> linkMan;
 	public MyHandler(){
  		this.contacts = new ArrayList<Map<String,String>>();
  		this.isAnaly = false;
  		this.sign = null;
 	}
 	
 	public List<Map<String,String>> getContacts() {
  		return contacts;
 	}
 	
 	/**
  	* 解析文档开始
  	*/
 	@Override
 	public void startDocument() throws SAXException {
  		System.out.println("解析文档开始");
 	}
 	
 	/**
  	* 解析开始
  	*/
 	@Override
 	public void startElement(String uri, String localName, String qName, Attributes 	attributes) throws SAXException {
  		this.sign = qName;
  		if(this.sign.equals("Linkman")) {
   			//每个联系人都是一个map
   			this.linkMan = new LinkedHashMap<String, String>();
   			System.out.println("解析联系人开始");
   			//解析属性:标识号
   			this.linkMan.put(attributes.getQName(0),attributes.getValue(0));
  		}
  		if(!this.sign.equals("contacts") && !this.sign.equals("Linkman") && !this.sign.equals("EMail")) {
   			//标记可以解析的元素
   			this.isAnaly = true;
  		}
 	}
 	
 	/**
  	* 解析内容
  	*/
 	@Override
 	public void characters(char[] ch, int start, int length) throws SAXException {
  		if(isAnaly != false) {
   			this.linkMan.put(this.sign, new String(ch,start,length));
  		}
 	}
 	
 	/**
  	* 解析结束
  	*/
 	@Override
 	public void endElement(String uri, String localName, String qName) throws SAXException {
  		this.isAnaly = false;
  		if(qName.equals("Linkman")) {
   			this.contacts.add(this.linkMan);
   			System.out.println("解析联系人结束");
  		}
 	}
 	
 	/**
  	* 解析文档结束
  	*/
 	@Override
 	public void endDocument() throws SAXException {
  		System.out.println("解析文档结束");
 	}
}

④加载解析器

MyHandler myHandler = new MyHandler()

⑤解析
使用解析容器的parse方法:
第一参数为使用上下文类加载器获取到的xml文件流
第二个参数为处理器

myParser.parse(Thread.currentThread()
     .getContextClassLoader()
      .getResourceAsStream("com/mfqh/analyze/Contacts.xml"), myHandler);

测试结果

List<Map<String, String>> myContact = myHandler.getContacts();
  	for(Map<String,String> linkMan : myContact) {
   		for(String key : linkMan.keySet()) {
    		System.out.println(key+":"+linkMan.get(key));
   	}
   	System.out.println();
  }

结果图:
在这里插入图片描述

发布了82 篇原创文章 · 获赞 1 · 访问量 1464

猜你喜欢

转载自blog.csdn.net/qq_41891805/article/details/104924976