KXML技术与J2ME开发

KXML技术与J2ME开发

 

【下载地址】

http://sourceforge.net/projects/kxml/files/下载源码和文档。


KXML是一个小巧的、基于事件模型的XML解析器,适合在MIDP设备上使用。
【缺点】
1.第三方的API添加进来之后,必然在很大程度上增加了MIDlet套件的大小。
2.解析XML的复杂性,会极大地消耗设备的内存,降低程序的执行速度。
【优点】

当C/S交互数据类型较多时,如果采用XML技术,将会极大降低C/S两侧程序员开发难度,因为他们可以在设计阶段就用标准的XML树形结构定义好数据格式。

 

【原则】

大概原则也就是这样的:
1.如果交互数据类型多,建议采用KXML技术。(KXML比SAX,DOM更加适合MIDP设备上使用)
2.如果服务器返回的数据有过多垃圾数据,那最好在C/S之间在加一个proxy server,用来过滤垃圾数据。

 

【使用方法】

KXML是基于事件模型的,按照下面的顺序依次读取标记
START_DOCUMENT - START_TAG - TEXT - END_TAG - END_DOCUMENT。

我们希望获取的数据一般是2种数据,1是TEXT标记里,另外一种是属性里:
1.TEXT标记:
例如:<geo:lat>39.93</geo:lat>
我们就可以通过parser.getText()获得。
2.Attribute值:

例如:<yweather:location city="Beijing" region=""   country="CH"/>
可以用

parser.getAttributeCount();

parser.getAttributeName(int index)

parser.getAttributeValue(int index)

结合使用,遍历一个标签中含有的所有属性值。

 

【例1】

 

/** * 解析XML,获取天气数据 * @param parser */ public void display(KXmlParser parser) { try { int eventType = parser.getEventType(); System.out.println("WeatherInfo::display - eventType=" + eventType); while (eventType != XmlPullParser.END_DOCUMENT) { switch (eventType) { case XmlPullParser.START_TAG: String tag = parser.getName(); if (tag.equals("yweather:location")) { System.out.println("WeatherInfo::display - yweather:location=" + tag); locValue.append("城市:"); for (int i = 0; i < parser.getAttributeCount(); i++) { if (parser.getAttributeName(i).equals("city")) { locValue.append(parser.getAttributeValue(i)); } else if (parser.getAttributeName(i).equals("country")) { locValue.append("("); locValue.append(parser.getAttributeValue(i)); locValue.append(")"); } locLabel.setText(locValue.toString()); } } else if (tag.equals("yweather:forecast")) { temperatureValue.append("气温:"); for (int i = 0; i < parser.getAttributeCount(); i++) { if (parser.getAttributeName(i).equals("day")) { dateValue.append(parser.getAttributeValue(i)); } else if (parser.getAttributeName(i).equals("date")) { dateValue.append("("); dateValue.append(parser.getAttributeValue(i)); dateValue.append(")"); } else if (parser.getAttributeName(i).equals("low")) { temperatureValue.append(parser.getAttributeValue(i)); } else if (parser.getAttributeName(i).equals("high")) { temperatureValue.append("-"); temperatureValue.append(parser.getAttributeValue(i)); } else if (parser.getAttributeName(i).equals("text")) { descriptionValue.append("天气情况:"); descriptionValue.append(parser.getAttributeValue(i)); } } if (isTodayInfo) { today_dateLabel.setText(dateValue.toString()); today_temperatureLabel.setText(temperatureValue.toString()); today_descriptionLabel.setText(descriptionValue.toString()); dateValue.delete(0, dateValue.length()); temperatureValue.delete(0, temperatureValue.length()); descriptionValue.delete(0, descriptionValue.length()); isTodayInfo = false; } else { tomorrow_dateLabel.setText(dateValue.toString()); tomorrow_temperatureLabel.setText(temperatureValue.toString()); tomorrow_descriptionLabel.setText(descriptionValue.toString()); dateValue.delete(0, dateValue.length()); temperatureValue.delete(0, temperatureValue.length()); descriptionValue.delete(0, descriptionValue.length()); isTodayInfo = true; } } break; case XmlPullParser.START_DOCUMENT: break; case XmlPullParser.END_TAG: break; case XmlPullParser.TEXT: break; default: break; } try { eventType = parser.next(); } catch (IOException e) { e.printStackTrace(); } } } catch (XmlPullParserException e) { e.printStackTrace(); } weatherInfoForm.refreshTheme(); weatherInfoForm.show(); }

例1主要是解析属性值,而对其他标签内容都不处理。

而其解析XML方法是其中之一:int eventType = parser.getEventType();

利用标签类型进行switch-case语句循环处理。

 

另外一种解析方法是:按照顺序解析XML数据。

【例2】

parser.require(KXmlParser.START_TAG, null, "**"); int size = parser.getAttributeCount(); for (int i = 0; i < size; i++) { if (parser.getAttributeName(i).equals("**")) { id = parser.getAttributeValue(i); } else { continue; } } parser.nextTag(); parser.require(KXmlParser.START_TAG, null, "**"); name = parser.nextText(); parser.require(KXmlParser.END_TAG, null, "**");

 

二者各有优势,使用在不同场景。

例1的方法优势体现在当数据有很多冗余垃圾数据时候用;

例2的方法稍微繁琐,对XML结构要求比较苛刻,完全是按照顺序读取XML数据,但优势是操作比较简单。

建议采用例1的方法解析,因为其对XML数据结构依赖性要小很多。

 

由于篇幅所限,不能列出工程全部源码。其中例1是以《Java ME 核心技术与最佳实践》中一个样例为原型,按照工程需要进行部分修改而来的。如果有感兴趣的朋友,可以找我索要工程源码。是一个天气预报的小工程。

 

 

 

你可能感兴趣的:(数据结构,xml,String,server,null,j2me)