這幾天一直在思考怎么樣設(shè)計Wap的引擎。因為在j2me有限的資源上去解釋xml是比較慢的,所以j2se上的xml類庫是不適合用在j2me上,后來
在網(wǎng)上查找了下發(fā)現(xiàn)了XmlPullParser ,而且用起來速度快,而且包也很小。現(xiàn)在把這兩天學(xué)到的知識記錄下來。
我的需求是解釋一個標(biāo)準(zhǔn)的wml。比如:
xml 代碼
- xml version="1.0"?>
- >
- <wml>
- <card id="index" title="天速">
- <p align="center">天速科技p>
- <p align="center"><a > 動漫天下 a>p>
- <p align="center"><a > 國色天香 a>p>
- <p align="center"><a > 風(fēng)月書齋 a>p>
-
- card> wml>
上面是個簡單的wml源文件。不過現(xiàn)在的wap網(wǎng)站差不都這樣,基本上沒有script,跟html上的各個控件。所以能解釋上面的文檔,基本上都是可以滿足我的需求的。
java 代碼
- /********************************************************************
- * 項目名稱 :<b>j2me學(xué)習(xí) J2me Wap Explorer</b> <br/>
- *
- * Copyright 2005-2006 Wuhua. All rights reserved </br>
- *
- * 本程序只用于學(xué)習(xí)目的,不能用于商業(yè)目的。如有需要請聯(lián)系作者
- ********************************************************************/
-
- import java.io.ByteArrayInputStream;
- import java.io.IOException;
- import java.io.InputStreamReader;
-
- import org.kxml2.io.KXmlParser;
- import org.xmlpull.v1.XmlPullParser;
- import org.xmlpull.v1.XmlPullParserException;
- /**
- * <b>類名:Test.java</b> </br> 編寫日期: 2006-12-28 <br/> 程序功能描述: <br/> Demo: <br/>
- * Bug: <br/>
- *
- * 程序變更日期 :<br/> 變更作者 :<br/> 變更說明 :<br/>
- *
- * @author wuhua </br> <a href="mailto:rrq12345@163.com">rrq12345@163.com</a>
- */
- public class Test {
-
- //private static String xml = "<list><item>apple</item>"
- // + "<item>orange</item>" + "<item>pear</item></list>";
-
- private static String xml ="<?xml version=\"1.0\"?>"
- +"<!DOCTYPE wml PUBLIC \"-//WAPFORUM//DTD WML 1.1//EN\" "
- +"\"http://www.wapforum.org/DTD/wml_1.1.xml\">"
- +"<wml>"
- +"<card id=\"index\" title=\"天速\">"
- +"<p align=\"center\">天速科技</p>"
- +"<p align=\"center\"><a href=\"/t/main.a\"> 動漫天下 </a></p>"
- +"<p align=\"center\"><a href=\"/t/main.a\"> 國色天香 </a></p>"
- +"<p align=\"center\"><a href=\"/eb/main.a\"> 風(fēng)月書齋 </a></p>"
-
- +"</card> </wml>";
- public static void main(String args[])
-
- throws XmlPullParserException, IOException {
-
-
- ByteArrayInputStream bin = new ByteArrayInputStream(xml.getBytes());
- InputStreamReader in = new InputStreamReader(bin);
- KXmlParser parser = new KXmlParser();
- parser.setInput(in);
-
- int eventType = parser.getEventType();
- while (eventType != XmlPullParser.END_DOCUMENT) {
- if (eventType == XmlPullParser.START_DOCUMENT) {
- //System.out.println("Start document:");
- } else if (eventType == XmlPullParser.END_DOCUMENT) {
- //System.out.println("End document");
- } else if (eventType == XmlPullParser.START_TAG) {
- System.out.println(" " + parser.getName());
- //System.out.println("Start Count: " + parser.getAttributeCount());
- int size = parser.getAttributeCount();
- for(int i=0; i<size; i++){
- System.out.println(" " + parser.getAttributeName(i));
- System.out.println(" " + parser.getAttributeValue(i));
- }
-
-
- } else if (eventType == XmlPullParser.END_TAG) {
- System.out.println(" " + parser.getName());
- } else if (eventType == XmlPullParser.TEXT) {
- System.out.println(" " + parser.getText());
- }
- eventType = parser.next();
- }
- }
-
- }
現(xiàn)在我們來看下我們解釋wml的java文件
現(xiàn)在解釋下上面的東西,
XmlPullParser 只是個規(guī)范,可以到
http://xmlpull.org/ 下載。我們來看看這個規(guī)范要求我們做些什么。
里面主要的方法有
java 代碼
- //定義一個事件采用回調(diào)的方式,直到讀取xml完畢。
- public int getEventType() throws XmlPullParserException ;
- //遍歷下一個事件,返回一個事件的類型
- public int next() throws XmlPullParserException, IOException
- //得到當(dāng)前Tag名字
- public String getName();
- //獲取文本
- public String getText();
-
- //得到當(dāng)前Tag下面的屬性數(shù)量
- public int getAttributeCount() ;
- //得到當(dāng)前Tag下面指定位置的屬性名稱
- public String getAttributeName(int index);
-
- //得到當(dāng)前Tag下面指定位置的屬性植
- public String getAttributeValue(int index);
我們理解了XmlPullParser 可以自己實現(xiàn)一個XmlPullParser。不過java世界里好東西就是多。已經(jīng)有人幫我們做了。
啊就是kxml。
這個API本身很簡單。當(dāng)時要把一個完整的wml解釋并繪制在手機(jī)上還是要花相當(dāng)?shù)臅r間的。