Java代碼:
package com.xushouwei.xml;
import java.io.File;
import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
/**
* SAX解析XML數據
* 原理:
* SAX解析器對XML文檔解析會從XML文檔開始位置起進行解析,同事根據已經定義好的事件處理器,來決定當前所解析的部分(元素、屬性、或是元素內容)是否有必要記錄並保存。相對於DOM解析,他的有點事佔用內存小查找速度更快點。
* @author 徐守威
*
*/
public class SAXParseDemo {
public static void main(String[] args) {
//創建解析XML文檔對象,其保存在E盤的根目錄下的article.xml
File xmlFile=new File("E:\\article.xml");
//創建一個SAXParserFactory對象,通過單例模式創建,SAXParserFactory對象相當於是SAXParser解析器的創建工程,通過SAXParserFactory.newInstance()方法創建SAXParserFactory對象
SAXParserFactory factory=SAXParserFactory.newInstance();
try {
//從SAXParserFactory得到SAXParser對象
SAXParser parser=factory.newSAXParser();
//解析文件內容
try {
parser.parse(xmlFile, new MySaxHandler());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//因爲SAX解析是事件驅動的,因此我們這裏定義一個時間的監聽器對象,MySaxHandler,該類可以繼承DefaultHandler類,這類似Swing中的事件監聽器,這裏要了解一下
class MySaxHandler extends DefaultHandler
{
//格式化日期格式
static DateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//內容
private String content;
//事件發生時元素中的字符
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
// TODO Auto-generated method stub
content=new String(ch, start, length);
}
//當解析到元素的結束標籤時觸發
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
// TODO Auto-generated method stub
//如果是標題
if("title".equals(qName))
{
System.out.println("標題:"+content);
}
//如果是作者
else if("author".equals(qName))
{
System.out.println("作者:"+content);
}
//如果是郵件
else if("email".equals(qName))
{
System.out.println("郵件:"+content);
}
//如果是內容
else if("body".equals(qName))
{
System.out.println("內容:"+content);
}
//如果是日期
else if("date".equals(qName))
{
System.out.println("日期:"+content);
}
}
//當解析到元素的開始標籤時觸發
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
// TODO Auto-generated method stub
if("article".equals(qName))
{
//如果節點名稱爲article,則輸出article元素屬性category
System.out.println("\r\n找到一篇文章,所屬分類:"+attributes.getValue("category")+".");
}
}
}
xml代碼:
<?xml version="1.0" encoding="GB2312"?>
<articles>
<article category="Android">
<title>Android學習之路</title>
<author>徐守威</author>
<email>[email protected]</email>
<date>2016-05-20</date>
</article>
<article category="JavaWeb">
<title>JavaWeb學習筆記</title>
<author>Jasxu</author>
<email>[email protected]</email>
<date>2016-05-21</date>
</article>
</articles>