SAX解析Xml

<?xml version="1.0" encoding="UTF-8"?>

<articles>
    <article cate="xml">
        <title>XML概述</title>
        <author>沈健</author>
        <date>20170404</date>
    </article>
    <article cate="java">
        <title>java概述</title>
        <author>沈斌</author>
        <date>20170403</date>
    </article>   
</articles>
package util.xml.parse;

import java.io.File;
import java.io.InputStream;

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

public class SaxXmlParse{
	
	/**
	 * DOM在解析的時候會把整個XML文件全部映射到Document裏的樹狀結構。當遇到比較大
	 * 的XML文件時,缺點顯而易見:佔用內存多,查找速度慢。
	 * SAX解析器在文檔解析的時候會從XML文件的開始位置進行解析,同時定義好事件處理器,
	 * 來決定當前解析的部分是否有必要記錄並存儲。
	 */
	private static SAXParserFactory factory=SAXParserFactory.newInstance();
	
	public SaxXmlParse(String fileName){
		
	    //獲取當前類的包名
		String packageName=this.getClass().getPackage().getName().replace(".", "/");
		System.out.println(packageName);
		
		//獲取文件流
		InputStream input=this.getClass().getResourceAsStream("/"+packageName+"/"+fileName);
		
		parseXml(input);
	}
	private  void parseXml(InputStream input){
			
		try {
			SAXParser parser=factory.newSAXParser();
			//解析時間,定義解析時的時間處理
			parser.parse(input, new MySaxHandler());
			
		} catch (Exception e){
			e.printStackTrace();
		}
	}
}
package util.xml.parse;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

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

public class MySaxHandler extends DefaultHandler {

	private String content;

	//當解析到元素的開始標籤時觸發
	@Override
	public void startElement(String uri, String localName, String qName,
			Attributes attributes) throws SAXException {
		if("article".equals(qName)){
			System.out.println("找到一篇文章,所屬分類:"+attributes.getValue("cate"));
		}
	}

	//當解析到元素的結束標籤時進行觸發
	@Override
	public void endElement(String uri, String localName, String qName)
			throws SAXException {
	    switch(qName){
	    case "title":
	    	System.out.println("文章主題爲:"+content);
	    	break;
	    case "author":
	    	System.out.println("文章作者爲:"+content);
	    	break;
	    case "date":
	    	System.out.println("文章日期爲:"+content);
	    	break;
	    }
	}

	//事件發生時元素的字符
	@Override
	public void characters(char[] ch, int start, int length)
			throws SAXException {
		content=new String(ch,start,length);
	}	
}
package util.xml.parse.test;

import org.junit.Test;

import util.xml.parse.SaxXmlParse;

public class SaxXmlParseTest {

	@Test
	public void testSaxXmlParse(){
		new SaxXmlParse("article.xml"); 	
	}
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章