这几天一直在思考怎么样设计Wap的引擎。因为在j2me有限的资源上去解释xml是比较慢的,所以j2se上的xml类库是不适合用在j2me上,后来在网上查找了下发现了XmlPullParser ,而且用起来速度快,而且包也很小。现在把这两天学到的知识记录下来。
我的需求是解释一个标准的wml。比如:
java 代码
- <?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"> 风月书斋 </a></p>
-
- </card> </wml>
上面是个简单的wml源文件。不过现在的wap网站差不都这样,基本上没有script,跟html上的各个控件。所以能解释上面的文档,基本上都是可以满足我的需求的。
现在我们来看下我们解释wml的java文件
java 代码
-
-
-
-
-
-
-
-
- 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;
- import org.xmlpull.v1.XmlPullParserFactory;
-
-
-
-
-
-
-
-
- public class Test {
-
-
-
-
- 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\"> 风月书斋 </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) {
-
- } else if (eventType == XmlPullParser.END_DOCUMENT) {
-
- } else if (eventType == XmlPullParser.START_TAG) {
- System.out.println(" " + parser.getName());
-
- 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();
- }
- }
-
- }
现在解释下上面的东西,
XmlPullParser 只是个规范,可以到http://xmlpull.org/ 下载。我们来看看这个规范要求我们做些什么。
里面主要的方法有
java 代码
-
- public int getEventType() throws XmlPullParserException ;
-
- public int next() throws XmlPullParserException, IOException
-
- public String getName();
-
- public String getText();
-
-
- public int getAttributeCount() ;
-
- public String getAttributeName(int index);
-
-
- public String getAttributeValue(int index);
我们理解了XmlPullParser 可以自己实现一个XmlPullParser。不过java世界里好东西就是多。已经有人帮我们做了。
啊就是kxml。
这个API本身很简单。当时要把一个完整的wml解释并绘制在手机上还是要花相当的时间的。 |