在设计wap Explorer时关键的一步是解释wml生成UI控件,并添加到Form上对于我来说遇到了困难。
     比如:1.网络读取的wml有很多是不规范的wml比如缺少结束标记,或者游戏特殊字符,比如字符'<'而网络上的可能是“《”这样解释的时候就会抛出异常--对于kml解释器来说。这样的话,下面的就解释不到了。只能显示一部分的wml,所以这就需要一个容错能力强的wml解释器。
    2。生成UI控件,因为j2me高级UI不提供对这些方面的需求,所以就要自己来设计。自己设计要考虑到事件处理,UI控件的位置处理等。这就决定了,是一开始解释就确定UI的位置呢。还是解释好。绘制出来的时候才具体进行位置匹配。
   3.。。
   4.。。。
 
    好现在将我解释一些简单的wml思路整理出来。在这些代码中只能解释不带特殊标记的wml,比如&nbsp;(主要是kxml会报错)。
   首先自己写一个接口专门用于解释wml,并生成结果对象。


java 代码


 

public interface
    Vector getResult();  
void parser() throws
}



对于wap来说。标记语言也是比较多的。比如wml, xhtml等,现在我只写支持wml的wap。里面的代码只是思路。


java 代码


 

public final class WmlParser implements
private static Logger logger = Logger.getLogger("WmlParser");  
/**
     * Wap GUI集合
     */
private   Vector parts = new
private
       
private   Hashtable attr = new
   
      
/**
     * 当前标记,通过当前标记来创建Wap UI.
     */
private
      
/**
     * 创建当前Align.
     */
private
    KXmlParser parser;  
      
      
private WmlParser(InputStream in) throws
new
"UTF-8");  
    }  
      
public static WmlParser getWmlParser(InputStream in) throws
return new
    }  
       
/**
     * 解释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
throws
if(parser == null)  
throw new XmlPullParserException("Parser is Null");  
  
int
while
if
                   
else if
                   
else if
                parserWapTagImpl(parser );  
               
else if
               
else if
                parserTextImpl(parser);  
            }  
            eventType = parser.next();  
        }  
//return parts;
    }  
private void
"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
        String text = parser.getText();  
      
if(text != null || !text.equals("")){  
            part = WAPGUIFactory.createStringPart(parser.getText(), Style.PLAIN_SMALL, align);  
            parts.addElement(part);  
"Text : "
        }  
        attr.clear();  
    }  
  
/**
     * 处理HyperLink,并生成HyperLink控件
     * @param parser
     */
private   void
0]);  
if(herf != null && !parser.getText().equals("")){             
               
             part = WAPGUIFactory.createHyperLink(parser.getText(), herf, align);  
             parts.addElement(part);  
// logger.debug(herf);
         }  
         attr.clear();  
          
    }  
  
private void
//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
//logger.debug("The One parser ... ");
         String name = parser.getName();  
int
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());  
                }  
                  
" : "
                  
            }  
         currentTag = name;  
    }  
  
public
return
    }  
}


唉,元旦3天都不曾怎么写代码。好像挺浪费的