浏览 8522 次
锁定老帖子 主题:解释wml
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-01-04  
WAP

     在设计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 代码
 
  1. public interface Parser {  
  2.     Vector getResult();  
  3.     void parser() throws Exception;  
  4. }  


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

java 代码
 
  1. public final class WmlParser implements Parser {  
  2.     private static Logger logger = Logger.getLogger("WmlParser");  
  3.     /** 
  4.      * Wap GUI集合 
  5.      */  
  6.     private   Vector parts = new Vector();;  
  7.     private   Part part;  
  8.        
  9.     private   Hashtable attr = new Hashtable();  
  10.    
  11.       
  12.     /** 
  13.      * 当前标记,通过当前标记来创建Wap UI. 
  14.      */  
  15.     private   String currentTag;  
  16.       
  17.     /** 
  18.      * 创建当前Align. 
  19.      */  
  20.     private String align;  
  21.     KXmlParser parser;  
  22.       
  23.       
  24.     private WmlParser(InputStream in) throws XmlPullParserException{  
  25.         parser = new KXmlParser();  
  26.         parser.setInput(in, "UTF-8");  
  27.     }  
  28.       
  29.     public static WmlParser getWmlParser(InputStream in) throws XmlPullParserException{  
  30.         return new WmlParser(in);  
  31.     }  
  32.        
  33.     /** 
  34.      * 解释wml,并生成一系列的Wap GUI部件。 
  35.      * 比如遇到<a href="index.wml">首页</a> 则对于的生成一个 HyperLink; 
  36.      * @see WAPGUIFactory.createHyperLink(String text, String url, 
  37.             String algin) ; 
  38.      * @param in -- 通过Net获取InputStream 
  39.      * @return -- 返回一个Vector集,里面包含了,Wap GUI 
  40.      * @throws XmlPullParserException -- 解释出错的时候抛出异常 
  41.      * @throws IOException -- 读取数据的时候抛出异常 
  42.      */  
  43.     public final   void parser()  
  44.             throws XmlPullParserException, IOException {  
  45.         if(parser == null)  
  46.             throw new XmlPullParserException("Parser is Null");  
  47.   
  48.         int eventType = parser.getEventType();  
  49.         while (eventType != XmlPullParser.END_DOCUMENT) {  
  50.             if (eventType == XmlPullParser.START_DOCUMENT) {  
  51.                    
  52.             } else if (eventType == XmlPullParser.END_DOCUMENT) {  
  53.                    
  54.             } else if (eventType == XmlPullParser.START_TAG) {  
  55.                 parserWapTagImpl(parser );  
  56.                
  57.             } else if (eventType == XmlPullParser.END_TAG) {  
  58.                
  59.             } else if (eventType == XmlPullParser.TEXT) {  
  60.                 parserTextImpl(parser);  
  61.             }  
  62.             eventType = parser.next();  
  63.         }  
  64.         //return parts;  
  65.     }  
  66.     private void parserTextImpl(KXmlParser parser) {  
  67.         logger.debug("The Two parser ... ");  
  68.         parserAlign();  
  69.         if(currentTag.equals(WmlTag.A_TAG)){  
  70.              parserHyperLinkImpl(parser);  
  71.         }else if(currentTag.equals(WmlTag.P_TAG)){  
  72.             paserStringPart(parser);  
  73.         }  
  74.     }  
  75.   
  76.     /** 
  77.      * 处理String的显示 
  78.      * @param parser2 
  79.      */  
  80.     private void paserStringPart(KXmlParser parser) {  
  81.         String text = parser.getText();  
  82.       
  83.         if(text != null || !text.equals("")){  
  84.             part = WAPGUIFactory.createStringPart(parser.getText(), Style.PLAIN_SMALL, align);  
  85.             parts.addElement(part);  
  86.             logger.debug("Text : " +  text);  
  87.         }  
  88.         attr.clear();  
  89.     }  
  90.   
  91.     /** 
  92.      * 处理HyperLink,并生成HyperLink控件 
  93.      * @param parser 
  94.      */  
  95.     private   void parserHyperLinkImpl(KXmlParser parser) {  
  96.          String herf = (String) attr.get(WmlTag.A_ATTR[0]);  
  97.          if(herf != null && !parser.getText().equals("")){             
  98.                
  99.              part = WAPGUIFactory.createHyperLink(parser.getText(), herf, align);  
  100.              parts.addElement(part);  
  101.             // logger.debug(herf);  
  102.          }  
  103.          attr.clear();  
  104.           
  105.     }  
  106.   
  107.     private void parserAlign() {  
  108.         //align = (String)attr.get(WmlTag.P_ATTR[1]);  
  109.         if(align == null || align.toLowerCase().equals("left")){  
  110.              align = Part.ALIGN_LEFT;  
  111.          }else if(align.toLowerCase().equals("center")){  
  112.              align = Part.ALIGN_CENTER;  
  113.          }else if(align.toLowerCase().equals("right")){  
  114.              align = Part.ALIGN_RIGHT;  
  115.          }else{  
  116.              align = Part.ALIGN_LEFT;  
  117.          }  
  118.            
  119.     }  
  120.   
  121.     /** 
  122.      * 解释Wap标记,并把属性保存到attr 
  123.      * @param parser 
  124.      */  
  125.     private   void parserWapTagImpl(KXmlParser parser) {  
  126.         //logger.debug("The One parser ... ");  
  127.          String name = parser.getName();  
  128.          int size = parser.getAttributeCount();  
  129.             for (int i = 0; i < size; i++) {  
  130.                 if(parser.getAttributeName(i).toLowerCase().equals(WmlTag.ALIGN)){  
  131.                     align = parser.getAttributeValue(i).toLowerCase();  
  132.                 }else{  
  133.                     attr.put(parser.getAttributeName(i).toLowerCase(), parser.getAttributeValue(i).toLowerCase());  
  134.                 }  
  135.                   
  136.                 logger.debug(parser.getAttributeName(i) + " : " + parser.getAttributeValue(i));  
  137.                   
  138.             }  
  139.          currentTag = name;  
  140.     }  
  141.   
  142.     public Vector getResult() {  
  143.         return parts;  
  144.     }  
  145. }  


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

论坛首页 移动开发技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics