在设计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
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天都不曾怎么写代码。好像挺浪费的