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 核心技术与最佳实践》中一个样例为原型,按照工程需要进行部分修改而来的。如果有感兴趣的朋友,可以找我索要工程源码。是一个天气预报的小工程。