日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
使用SAXParser處理XML文檔

在本文中主要就如何用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"?> 
<Books>
   <Book id="8542f26f-80d4-4b7d-ab25-f80f72a852ef">
       <name id="201">
            <strings>
                <entry>
                    <key>en_US</key>
                    <value> thinking in Java</value>
                </entry>
            </strings>
        </name>
       <Author>
              <entry>
                    <key>en_US</key>
                    <value>Tom</value>
                </entry>
       </Author>
       <icon>
       <url>think_java.PNG</url>
       </icon>
    </Book>
    ...
</Books>

應(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 { 
private String id = null;
private String name = null;
private String author = null;
private Image image = null;
// 一系列的get和set方法。略去
public String toString() 
{
return "Book [" + "ID=" + id + ", Name=" + name + ", Author=" + author + "]";
}
}

接下來(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()); 
  tableViewer.setLabelProvider(new BooksLabelProvider());
  tableViewer.setInput(getBooks());

其中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é)果是:

【編輯推薦】

  1. 在ASP.NET中使用Treeview控件和XML
  2. JavaScript解析XML的方法總結(jié)
  3. 使用 XStream 把 Java 對(duì)象序列化為 XML

文章名稱:使用SAXParser處理XML文檔
網(wǎng)站URL:http://www.dlmjj.cn/article/dpegpcd.html