在设计wap Explorer时关键的一步是解释wml生成UI控件,并添加到Form上对于我来说遇到了困难。
比如:1.网络读取的wml有很多是不规范的wml比如缺少结束标记,或者游戏特殊字符,比如字符'<'而网络上的可能是“《”这样解释的时候就会抛出异常--对于kml解释器来说。这样的话,下面的就解释不到了。只能显示一部分的wml,所以这就需要一个容错能力强的wml解释器。
2。生成UI控件,因为j2me高级UI不提供对这些方面的需求,所以就要自己来设计。自己设计要考虑到事件处理,UI控件的位置处理等。这就决定了,是一开始解释就确定UI的位置呢。还是解释好。绘制出来的时候才具体进行位置匹配。
3.。。
4.。。。
好现在将我解释一些简单的wml思路整理出来。在这些代码中只能解释不带特殊标记的wml,比如 (主要是kxml会报错)。
首先自己写一个接口专门用于解释wml,并生成结果对象。
java 代码
- public interface Parser {
- Vector getResult();
- void parser() throws Exception;
- }
对于wap来说。标记语言也是比较多的。比如wml, xhtml等,现在我只写支持wml的wap。里面的代码只是思路。
java 代码
- public final class WmlParser implements Parser {
- private static Logger logger = Logger.getLogger("WmlParser");
- /**
- * Wap GUI集合
- */
- private Vector parts = new Vector();;
- private Part part;
- private Hashtable attr = new Hashtable();
- /**
- * 当前标记,通过当前标记来创建Wap UI.
- */
- private String currentTag;
- /**
- * 创建当前Align.
- */
- private String align;
- KXmlParser parser;
- private WmlParser(InputStream in) throws XmlPullParserException{
- parser = new KXmlParser();
- parser.setInput(in, "UTF-8");
- }
- public static WmlParser getWmlParser(InputStream in) throws XmlPullParserException{
- return new WmlParser(in);
- }
- /**
- * 解释wml,并生成一系列的Wap GUI部件。
- * 比如遇到<a href="index.wml">首页</a> 则对于的生成一个 HyperLink;
- * @see WAPGUIFactory.createHyperLink(String text, String url,
- String algin) ;
- * @param in -- 通过Net获取InputStream
- * @return -- 返回一个Vector集,里面包含了,Wap GUI
- * @throws XmlPullParserException -- 解释出错的时候抛出异常
- * @throws IOException -- 读取数据的时候抛出异常
- */
- public final void parser()
- throws XmlPullParserException, IOException {
- if(parser == null)
- throw new XmlPullParserException("Parser is Null");
- 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) {
- parserWapTagImpl(parser );
- } else if (eventType == XmlPullParser.END_TAG) {
- } else if (eventType == XmlPullParser.TEXT) {
- parserTextImpl(parser);
- }
- eventType = parser.next();
- }
- //return parts;
- }
- private void parserTextImpl(KXmlParser parser) {
- logger.debug("The Two parser ... ");
- parserAlign();
- if(currentTag.equals(WmlTag.A_TAG)){
- parserHyperLinkImpl(parser);
- }else if(currentTag.equals(WmlTag.P_TAG)){
- paserStringPart(parser);
- }
- }
- /**
- * 处理String的显示
- * @param parser2
- */
- private void paserStringPart(KXmlParser parser) {
- String text = parser.getText();
- if(text != null || !text.equals("")){
- part = WAPGUIFactory.createStringPart(parser.getText(), Style.PLAIN_SMALL, align);
- parts.addElement(part);
- logger.debug("Text : " + text);
- }
- attr.clear();
- }
- /**
- * 处理HyperLink,并生成HyperLink控件
- * @param parser
- */
- private void parserHyperLinkImpl(KXmlParser parser) {
- String herf = (String) attr.get(WmlTag.A_ATTR[0]);
- if(herf != null && !parser.getText().equals("")){
- part = WAPGUIFactory.createHyperLink(parser.getText(), herf, align);
- parts.addElement(part);
- // logger.debug(herf);
- }
- attr.clear();
- }
- private void parserAlign() {
- //align = (String)attr.get(WmlTag.P_ATTR[1]);
- if(align == null || align.toLowerCase().equals("left")){
- align = Part.ALIGN_LEFT;
- }else if(align.toLowerCase().equals("center")){
- align = Part.ALIGN_CENTER;
- }else if(align.toLowerCase().equals("right")){
- align = Part.ALIGN_RIGHT;
- }else{
- align = Part.ALIGN_LEFT;
- }
- }
- /**
- * 解释Wap标记,并把属性保存到attr
- * @param parser
- */
- private void parserWapTagImpl(KXmlParser parser) {
- //logger.debug("The One parser ... ");
- String name = parser.getName();
- int size = parser.getAttributeCount();
- for (int i = 0; i < size; i++) {
- if(parser.getAttributeName(i).toLowerCase().equals(WmlTag.ALIGN)){
- align = parser.getAttributeValue(i).toLowerCase();
- }else{
- attr.put(parser.getAttributeName(i).toLowerCase(), parser.getAttributeValue(i).toLowerCase());
- }
- logger.debug(parser.getAttributeName(i) + " : " + parser.getAttributeValue(i));
- }
- currentTag = name;
- }
- public Vector getResult() {
- return parts;
- }
- }
唉,元旦3天都不曾怎么写代码。好像挺浪费的