新聞中心
在本文中主要就如何用SAX解析xml文檔進(jìn)行說(shuō)明。

成都創(chuàng)新互聯(lián)公司專業(yè)為企業(yè)提供耒陽(yáng)網(wǎng)站建設(shè)、耒陽(yáng)做網(wǎng)站、耒陽(yáng)網(wǎng)站設(shè)計(jì)、耒陽(yáng)網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)與制作、耒陽(yáng)企業(yè)網(wǎng)站模板建站服務(wù),十多年耒陽(yáng)做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。
要解析的xml片段如下:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> |
應(yīng)用程序想從這個(gè)xml文檔中讀出各個(gè)book,并且需要提供查詢功能,即給定書(shū)的id,能夠找到作者和書(shū)名。
當(dāng)然,用jdom是很簡(jiǎn)單的方式,不過(guò)如果我們讀到的是一個(gè)stream,并且比較大,那么我們最好用SAXParser,不需要把整個(gè)xml文檔裝入內(nèi)存。
首先,我們建立一個(gè)Book類,保存book相關(guān)的信息。
public class Book {
public String toString() |
接下來(lái)我們新建一個(gè)類BooksSAXHandler,它擴(kuò)展了DefaultHandler,用于解析xml。SAX解析是以事件為基礎(chǔ)的,在這里我們處理三個(gè)事件,分別是startElement,endElement以及characters。為了獲取一個(gè)element里面的text值,我們需要程序知道當(dāng)前在處理那個(gè)結(jié)點(diǎn),但僅僅知道結(jié)點(diǎn)也是不夠的,因?yàn)榭梢杂型慕Y(jié)點(diǎn),故此我們引入currentPath,這樣可以唯一的定位到要處理的結(jié)點(diǎn)。下面給出了解析的方法,注意currentPath的用法。
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
currentPath.append(qName + "/");
if (qName.equals(ELEMENT_BOOK)) {
book = new Book();
if (attributes.getQName(0).equals(ELEMENT_ID)) {
book.setID(attributes.getValue(ELEMENT_ID));
}
}
}
public void endElement(String uri, String localName, String qName)
throws SAXException {
currentPath
.delete(currentPath.lastIndexOf(qName), currentPath.length());
if (qName.equals(ELEMENT_BOOK)) {
booksMap.put(book.getID(), book);
book = null;
}
}
public void characters(char[] ch, int start, int length)
throws SAXException {
if (currentPath.toString().equals(NAME_PATH)) {
book.setName(new String(ch, start, length));
} else if (currentPath.toString().equals(AUTHOR_PATH)) {
book.setAuthor(new String(ch, start, length));
}
}
接下來(lái),我們用javax.xml.parsers.SAXParser來(lái)解析這個(gè)xml文檔,SAXParser需要兩個(gè)參數(shù),一個(gè)是要解析的stream流,另外一個(gè)就是DefaultHandler的對(duì)象。到此為止,我們已經(jīng)清楚了解析這個(gè)xml的全部過(guò)程。在附件中有例子的完整代碼。
用戶界面是用jface的TableViewer實(shí)現(xiàn)的。這里簡(jiǎn)單介紹一下TableViewer的用法。定義了TableViewer之后,關(guān)鍵需要設(shè)置以下三個(gè)方法。
tableViewer.setContentProvider(new BooksContentProvider()); |
其中g(shù)etBooks()是提供數(shù)據(jù)的,返回所有數(shù)據(jù)的列表,在本例返回List<Book>。
BooksLabelProvider需要實(shí)現(xiàn)ITableLabelProvider,主要是返回table的對(duì)應(yīng)列的值。其中有兩個(gè)主要的方法,String getColumnText(Object element, int columnIndex) 以及Image getColumnImage(Object element, int columnIndex)。
在本例中,element對(duì)應(yīng)一個(gè)Book對(duì)象,getColumnText返回table對(duì)應(yīng)列的文本值,包括Book的ID,Name,Author等。getColumnImage 則返回table對(duì)應(yīng)列的Image,這里對(duì)應(yīng)Book的Image。
最后的運(yùn)行結(jié)果是:
【編輯推薦】
- 在ASP.NET中使用Treeview控件和XML
- JavaScript解析XML的方法總結(jié)
- 使用 XStream 把 Java 對(duì)象序列化為 XML
文章名稱:使用SAXParser處理XML文檔
網(wǎng)站URL:http://www.dlmjj.cn/article/dpegpcd.html


咨詢
建站咨詢
