public class SAXReader extends DefaultHandler {
java.util.Stack tags=new java.util.Stack();
//--------------XML Content-------------
String text=null;
String url=null;
String author=null;
String description=null;
String day=null;
String year=null;
String month=null;
//----------------------------------------------
public void endDocument() throws SAXException {
System.out.println("------Parse End--------");
}
public void startDocument() throws SAXException {
System.out.println("------Parse Begin--------");
}
public void startElement(String p0, String p1, String p2, Attributes p3) throws SAXException {
tags.push(p1);
}
public void endElement(String p0, String p1, String p2) throws SAXException {
tags.pop();
//一個(gè)link節(jié)點(diǎn)的信息收集齊了,將其格式化輸出
if (p1.equals("link")) printout();
}
public void characters(char[] p0, int p1, int p2) throws SAXException {
//從棧中得到當(dāng)前節(jié)點(diǎn)的信息
String tag=(String) tags.peek();
if (tag.equals("text")) text=new String(p0,p1,p2);
else if (tag.equals("url")) url=new String(p0,p1,p2);
else if (tag.equals("author")) author=new String(p0,p1,p2);
else if (tag.equals("day")) day=new String(p0,p1,p2);
else if (tag.equals("month")) month=new String(p0,p1,p2);
else if (tag.equals("year")) year=new String(p0,p1,p2);
else if (tag.equals("description")) year=new String(p0,p1,p2);
}
private void printout(){
System.out.print("Content: ");
System.out.println(text);
System.out.print("URL: ");
System.out.println(url);
System.out.print("Author: ");
System.out.println(author);
System.out.print("Date: ");
System.out.println(day+"-"+month+"-"+year);
System.out.print("Description: ");
System.out.println(description);
System.out.println();
}
static public void main(String[] args) {
String filename = null;
boolean validation = false;
filename="links.xml";
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser saxParser=null;
try {
saxParser = spf.newSAXParser();
} catch (Exception ex) {
System.err.println(ex);
System.exit(1);
}
try {
saxParser.parse(new File(filename),new SAXReader());
} catch (SAXException se) {
System.err.println(se.getMessage());
System.exit(1);
} catch (IOException ioe) {
System.err.println(ioe);
System.exit(1);
}
}
}
在這兒雖然沒(méi)有使用到棧的分析,但實(shí)際上棧的分析是一件很容易的事情,應(yīng)為java.util.Stack繼承了java.util.Vector類(lèi),而且Stack中的元素是按棧的結(jié)構(gòu)由底至上排列的,因個(gè),我們可以使用Vector類(lèi)的size()方法來(lái)得到Stack的元素個(gè)數(shù),還可以使用Vector的get(int)方法來(lái)得到具體的每一個(gè)元屬。實(shí)際上,如果把Stack的元素從底向上逐一排列出來(lái),我們就得到了從XML根節(jié)點(diǎn)到當(dāng)前節(jié)點(diǎn)的一條唯一的路徑,有了這條路徑的信息,文檔的結(jié)構(gòu)就在清楚不過(guò)了。
小節(jié)
好了,到這兒為止,我們已經(jīng)掌握了對(duì)于XML編程的兩大利器:DOM和SAX,也知道了該如何在一個(gè)Java程序中使用它們。DOM編程相對(duì)簡(jiǎn)單,但是速度比較慢,占用內(nèi)存多,而SAX編程復(fù)雜一些,但是速度快,占用內(nèi)存少。所以,我們應(yīng)該根據(jù)不同的環(huán)境選擇使用不同的方法。大部分的XML應(yīng)用基本都可以用它們來(lái)解決。需要特別說(shuō)明的是,DOM和SAX其實(shí)都是語(yǔ)言無(wú)關(guān)的,并非Java所獨(dú)有,也就是說(shuō),只要有相應(yīng)的語(yǔ)言實(shí)現(xiàn),DOM和SAX可以應(yīng)用在任何面向?qū)ο蟮恼Z(yǔ)言中。
相關(guān)推薦:計(jì)算機(jī)等級(jí)考試二級(jí)Java經(jīng)典算法大全匯總
北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |