国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

使用JSR172解析XML

2019-11-18 16:10:21
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友


         在上篇文章講述了SonyEriCSSon發(fā)布了更好支持企業(yè)級(jí)應(yīng)用程序開發(fā)的新JSR,這其中就包括J2ME Web Service 1.0(JSR 172),索尼愛(ài)立信的W600就支持了JSR172。本文講述如何使用JSR 172提供的API來(lái)解析xml
 我們知道JSR172是由兩個(gè)部分組成的:
1. 一個(gè)輕量級(jí)的標(biāo)準(zhǔn)XML解析器
2. Web Services的遠(yuǎn)程調(diào)用API
其中這個(gè)JSR172實(shí)現(xiàn)的輕量級(jí)的XML解析器是JAXP1.2(java API for XML PRocessing)的一個(gè)子集。我們可以查看WTK提供的API看到j(luò)2me-xml提供的類一共只有12個(gè),這說(shuō)明這個(gè)輕量級(jí)的XML解析器是適合在移動(dòng)電話這種資源受限設(shè)備上運(yùn)行的。
       
        下面我們通過(guò)一個(gè)例子介紹如何使用JSR 172解析XML,首先我們需要準(zhǔn)備一個(gè)XML文件放在項(xiàng)目當(dāng)中,內(nèi)容如下:



諾基亞7610
黑色


值得注意的是當(dāng)XML文件中包含漢字的時(shí)候,我們應(yīng)該使用文本工具,比如notepad或者Ultral Edit等把它轉(zhuǎn)換成UTF-8編碼文件,否則解析的結(jié)果將包含亂碼。
        
        為了保存XML文件中的信息,我們構(gòu)造一個(gè)普通的Java類Phone,它包含兩個(gè)成員變量分別對(duì)應(yīng)name和colour,代碼如下所示:
/*
 * Phone.java
 *
 * Created on 2005年8月6日, 下午9:40
 *
 * To change this template, choose Tools Options and locate the template under
 * the Source Creation and Management node. Right-click the template and choose
 * Open. You can then make changes to the template in the Source Editor.
 */

/**
 *
 * @author Administrator
 */
public class Phone {
   
    private String colour = "";
    private String name = "";
    /** Creates a new instance of Phone */
    public Phone() {
    }

    public String getColour() {
        return colour;
    }

    public void setColour(String colour) {
        this.colour = colour;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
   
}
 在JSR 172中實(shí)現(xiàn)的是SAX模式的解析器,它和DOM模式的不同在于,SAX解析器按照順序解析文件并不保存其內(nèi)容,而DOM解析器則是首先把XML文件解析后存儲(chǔ)在一個(gè)對(duì)象樹中,可見(jiàn)DOM模式更加耗費(fèi)內(nèi)存資源。能夠解析XML之前首先需要?jiǎng)?chuàng)建SAXParser的實(shí)例,
      SAXParserFactory factory = SAXParserFactory.newInstance();
      SAXParser saxParser = factory.newSAXParser();
接下來(lái)我們要獲得XML文件的輸入流,并把它作為其中一個(gè)參數(shù)傳遞給saxParser的parse方法,
      InputStream is = this.getClass().getResourceAsStream("phone.xml");
      saxParser.parse(is,new BasicHandler(this));
 那么SAXParser是如何解析xml文件的呢?DefaultHandler是SAX2默認(rèn)的事件處理器基類,用于處理XML解析事件的方法如下:
startDocument()
startElement(java.lang.String uri, java.lang.String localName, java.lang.String qName, Attributes attributes)
characters(char[] ch, int start, int length)
endElement(java.lang.String uri, java.lang.String localName, java.lang.String qName)
endDocument()
默認(rèn)情況下,DefaultHandler的上述方法什么也不做,因此我們必須自己擴(kuò)展DefaultHandler并且覆蓋上述的方法。我們的程序中提供了一個(gè)BasicHandler用來(lái)處理xml文件。
class BasicHandler extends DefaultHandler
在BasicHandler類中有兩個(gè)成員變量
    private Vector phones = new Vector();
    private Stack tagStack = new Stack();
phones用來(lái)存儲(chǔ)我們已經(jīng)解析出來(lái)的Phone對(duì)象,tagStack則用來(lái)存放我們解析到的元素名稱,比如sonyericsson,phone,name,colour等。在文檔解釋結(jié)束后,也就是在endDocument()方法內(nèi)我們把解析的結(jié)果顯示在手機(jī)屏幕上,為了讓讀者可以更清楚地明白SAX解析器的解析順序,這里筆者用了一些打印語(yǔ)句來(lái)把重要的信息打印出來(lái),BasicHandler的幾個(gè)重要方法如下:
public void startDocument() throws SAXException {}
   
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        System.out.println("the qName is "+qName);
        if(qName.equals("phone")) {
            Phone phone = new Phone();
            phones.addElement(phone);
        }
       
        tagStack.push(qName);
        System.out.println("the tag stack's length is "+tagStack.size());
    }
   
    public void characters(char[] ch, int start, int length) throws SAXException {
        String chars = new String(ch, start, length).trim();
        System.out.println("the character is "+chars);
       
        if(chars.length() > 0) {
            String qName = (String)tagStack.peek();
           
            Phone currentPhone = (Phone)phones.lastElement();
           
            if (qName.equals("name")) {
                currentPhone.setName(chars);
            } else if(qName.equals("colour")) {
                currentPhone.setColour(chars);
            }
        }
    }
   
    public void endElement(String uri, String localName, String qName) throws SAXException {
        System.out.println("the end qName is "+qName);
        tagStack.pop();
    }
   
    public void endDocument() throws SAXException {
        StringBuffer result = new StringBuffer();
        for (int i=0; i            Phone currentPhone = (Phone)phones.elementAt(i);
            result.append(currentPhone.getName() + " 是 " + currentPhone.getColour() + "/n");
        }
       
        helloXML.alert(result.toString());
    }
  使用JSR172解析XML
從這里下載源代碼
總結(jié):本文講述了如何使用JSR 172提供的輕量級(jí)XML解析器來(lái)解析XML,并給出了具體的代碼。下篇文章我們將一起學(xué)習(xí)一下如何使用Web Services的遠(yuǎn)程調(diào)用API。


(出處:http://www.survivalescaperooms.com)



發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 抚州市| 汕头市| 华池县| 南宫市| 仪陇县| 罗平县| 静海县| 读书| 延吉市| 张家界市| 遂溪县| 鄢陵县| 景宁| 镇雄县| 栾川县| 克山县| 尚志市| 马公市| 崇文区| 东兰县| 得荣县| 吴旗县| 额尔古纳市| 茂名市| 扎鲁特旗| 贺兰县| 鹤山市| 贞丰县| 英吉沙县| 光泽县| 石棉县| 屏东县| 偏关县| 余姚市| 民丰县| 格尔木市| 璧山县| 博湖县| 福贡县| 达拉特旗| 阿图什市|