步驟1.一個簡單的XML文檔:
???XML代碼:
<?xml?version="1.0"?encoding="GBK"?>??
<StudentInfo>??
????<student>??
????????<name>趙海波</name>??
????????<sex>男</sex>??
????????<lesson>??
????????????<lessonName>Spring整合開發</lessonName>??
????????????<lessonScore>85</lessonScore>??
????????</lesson>??
????????<lesson>??
????????????<lessonName>輕量級J2EE應用開發</lessonName>??
????????????<lessonScore>95</lessonScore>??
????????</lesson>??
????????<lesson>??
????????????<lessonName>Ajax應用開發</lessonName>??
????????????<lessonScore>80</lessonScore>??
????????</lesson>??
????</student>??
????<student>??
????????<name>程衛娜</name>??
????????<sex>女</sex>??
????????<lesson>??
????????????<lessonName>Spring整合開發</lessonName>??
????????????<lessonScore>80</lessonScore>??
????????</lesson>??
????????<lesson>??
????????????<lessonName>輕量級J2EE應用開發</lessonName>??
????????????<lessonScore>85</lessonScore>??
????????</lesson>??
????????<lesson>??
????????????<lessonName>Ajax應用開發</lessonName>??
????????????<lessonScore>90</lessonScore>??
????????</lesson>??
????</student>??
</StudentInfo>??

步驟2.用于處理XML文檔的事件監聽器:
???Java代碼:
import?org.xml.sax.*;???
public?class?XMLContentHandler?implements?ContentHandler???


{??????
????//DTD中定義的元素名???
????private?static?final?String?ELEMENT_NAME?=?"name";???
????private?static?final?String?ELEMENT_SEX?=?"sex";???
????private?static?final?String?ELEMENT_LESSON?=?"lesson";???
????private?static?final?String?ELEMENT_LESSON_NAME?=?"lessonName";???
????private?static?final?String?ELEMENT_LESSON_SCORE?=?"lessonScore";???
????private?static?final?String?ELEMENT_STUDENT?=?"student";???
????private?static?final?String?ELEMENT_LINE?=?"breakLine";????
????//當前元素的數據???
????private?String?currentData?=?"";???
????private?String?lessonName?=?"";???
????private?String?lessonScore?=?"";???
????//當其他某一個調用事件發生時,先調用此方法來在文檔中定位。???
????public?void?setDocumentLocator(Locator?locator)???

????
{???
????}???
????//在解析整個文檔開始時調用???
????public?void?startDocument()?throws?SAXException???

????
{???
????????System.out.println("XML文件開始解析");???
????}???
????//在解析整個文檔結束時調用???
????public?void?endDocument()?throws?SAXException???

????
{???
????????System.out.println("XML文件解析結束");???
????}???
????//?在解析命名空間開始時調用???
????public?void?startPrefixMapping(String?prefix,?String?uri)?throws?SAXException???

????
{???
????????System.out.println("XML解析器開始解析命名空間");???
????}???
????//在解析命名空間結束時調用???
????public?void?endPrefixMapping(String?prefix)?throws?SAXException???

????
{???
????????System.out.println("XML解析器解析命名空間結束");???
????}???
????//在解析元素開始時調用???
????public?void?startElement(String?namespaceURI,?String?localName,String?qName,?Attributes?atts)?throws?SAXException???

????
{???
????????System.out.println("XML解析器開始解析元素"?+?localName);???
????}???
????//在解析元素結束時調用???
????public?void?endElement(String?namespaceURI,?String?localName,?String?qName)?throws?SAXException???

????
{???
????????if?(localName.equals(ELEMENT_NAME))???

????????
{???
????????????System.out.println(localName?+?"????:????"?+?currentData);???
????????}???
????????if?(localName.equals(ELEMENT_SEX))???

????????
{???
????????????System.out.println(localName?+?"?????:?????"?+?currentData);???
????????}???
????????if?(localName.equals(ELEMENT_LESSON_NAME))???

????????
{???
????????????this.lessonName?=?currentData;???
????????}???
????????if?(localName.equals(ELEMENT_LESSON_SCORE))???

????????
{???
????????????this.lessonScore?=?currentData;???
????????}???
????????if?(localName.equals(ELEMENT_LESSON))???

????????
{???
????????????System.out.println(lessonName?+?"??????:?????"?+?lessonScore);???
????????}???
????????System.out.println("XML解析器解析元素"?+?localName?+?"結束");???
????}???
????//?取得元素數據???
????public?void?characters(char[]?ch,?int?start,?int?length)?throws?SAXException???

????
{???
????????currentData?=?new?String(ch,?start,?length).trim();???
????????System.out.println("XML解析器成功解析到元素數據");???
????}???
????//取得元素數據中的空白???
????public?void?ignorableWhitespace(char[]?ch,?int?start,?int?length)?throws?SAXException???

????
{???
????}???
????//在解析到處理指令時,調用此方法。???
????public?void?processingInstruction(String?target,?String?data)?throws?SAXException???

????
{???
????}???
????//當未驗證解析器忽略實體時調用此方法???
????public?void?skippedEntity(String?name)?throws?SAXException???

????
{???
????}???
}??

步驟3.通過主程序開始解析XML文檔,解析XML文檔的代碼如下:
???java代碼:
import?java.io.*;???
import?org.xml.sax.*;???
import?org.xml.sax.helpers.*;???
public?class?SAXParser???


{???
????public?static?void?main(String[]?args)???

????
{???
????????SAXParser?sax?=?new?SAXParser();???
????????sax.parseXMLFile("student.xml");???
????}???
????//?解析文檔???
????private?void?parseXMLFile(String?fileName)???

????
{??????????
????????try??

????????
{???
????????????//通過指定解析器的名稱來動態加載解析器???
????????????XMLReader?parser?=?XMLReaderFactory.createXMLReader("org.apache.xerces.parsers.SAXParser");???
????????????//處理內容前要注冊內容管理器???
????????????parser.setContentHandler(new?XMLContentHandler());???
????????????//開始解析文檔???
????????????parser.parse(fileName);???
????????}???
????????catch?(IOException?e)???

????????
{???
????????????e.printStackTrace();???
????????}???
????????catch?(SAXException?e)???

????????
{???
????????????e.printStackTrace();???
????????}???
????}???
}??
