在這裡我們編寫一個myHandler的類,它用來實施HandlerBase接口,並且覆蓋接口的三個主要方法startElement(String tag, AttributeList attrs)、characters(char[] ch, int start, int length)、endElement(String name)以便能對XML文件進行操作。
為了保存數據以便外部程序能夠調用本類中的數據,我們采用了哈希表結構來保存解析XML文件後的所有節點名字以及節點的數據值,startElement()方法主要用來讀取XML文件中的節點名稱,characters()方法主要用來根據節點名稱讀取節點數據,endElement()方法主要是在一個XML節點處理完畢後將這對節點名稱和節點數據保存在哈希表中。
在外部程序中我們只需要調用getTable()方法返回一個哈希表對象就可以讀取所有的節點和節點數據值了。
代碼不多,而且我在下面添加了很多注釋,應該很好看懂了。
myHandler.java文件
file://文件放置在包com.jsp21.www中
package com.jsp21.www;
file://導入相關的java API
import java.io.*;
import org.w3c.dom.*;
import org.xml.sax.*;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import java.util.Hashtable;
import java.util.Enumeration;
// myHandler類實現HandlerBase接口;
public class myHandler extends HandlerBase {
private String myElement = null; file://XML文件中的標記名稱;
private String myValue = null; file://XML文件中標記對應的值;
private Hashtable mytable = new Hashtable(); file://用來保存XML文件中所有的數據;
file://得到保存有XML數據的哈希表Hashtable;
public Hashtable getTable() {
return mytable;
}
file://覆蓋HandlerBase接口中的startElement方法,讀取一行XML數據的開始標記時候執行此方法;
// tag代表XML中的標記,如前面XML文件中的NAME AGE等;
public void startElement(String tag, AttributeList attrs)
throws SAXException {
myElement = tag;
}
file://覆蓋HandlerBase接口中的characters方法,主要用來得到和之間具體的數據;
// 當對應myElement的標記發現值後,也就是startElement方法執行完畢後,就會觸發這個characters方法來得到具體的數值;
file://如myElement="姓名"時候,myValue就會等於"劉玉鋒";
public void characters(char[] ch, int start, int length)
throws SAXException {
myValue = new String(ch, start, length);
}
file://覆蓋HandlerBase接口中的endElement方法,主要用來在一行XML數據讀取完畢後進行自己的處理;
// 當XML文件中一行標記讀取完畢後,觸發此endElement方法;
file://如果存在對應的結束標記,就將前面得到的標記myElement和值myValue
file://放入到mytable哈希表中;
public void endElement(String name) throws SAXException {
if ( myElement.equals(name) ) {
mytable.put(myElement, myValue);
}
}
}
好了,編譯這個class,並把myHandler.class文件放置在CLASSPATH能找到的路徑中,比如Tomcat中應用程序的Web-inf\classes\com\jsp21\www目錄下。
XML和JSP交互技術(4)
5)Jsp程序調用XML
在這裡,我們寫了一個比較簡單的Jsp程序來調用前面的myHandler類,並通過這個類來讀取personal.xml文件中的內容,最後顯示在Jsp頁面中。
首先我們創建一個SAXParserFactory的實例saxpF,然後通過這個實例來創建一個SAXParser的實例saxpser(可以用來解析XML文件內容),當然還要創建myHandler類的實例,最後通過saxpser.parse()方法將XML文件和myHandler類實例關聯起來(這樣會執行myHandler中的幾個事件處理方法)。
(說明:SAXParserFactory是一個抽象類,定義了一個factory API可以讓Java應用程序配置或者是獲得一個SAX的解析器(SAX parser)。SAXParser也是一個抽象類,通過這個類應用程序可以解析XML文件的內容。)
到這時候XML所有內容都保存在了myHan