J2ME从服务器解析并读取xml文件,其实跟在本地读取xml文件相似,只是我们在下载服务器的xml时,需要注意将xml转码为“UTF-8”,服务器的xml文件跟我上次写的xiaochao.xml文件内容一样,所以这里就不再写了,大家可以去看上一期的博客,代码如下:
[img]http://dl.iteye.com/upload/attachment/214915/e0041509-8ac8-3c8b-8d98-8cf9a99bbf12.png[/img]
[img]http://dl.iteye.com/upload/attachment/214915/e0041509-8ac8-3c8b-8d98-8cf9a99bbf12.png[/img]
package com.mopietek;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import javax.microedition.io.Connector;
import javax.microedition.io.HttpConnection;
import javax.microedition.lcdui.Choice;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Form;
import javax.microedition.lcdui.List;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;
import javax.microedition.rms.RecordEnumeration;
import javax.microedition.rms.RecordStore;
import javax.microedition.rms.RecordStoreException;
import javax.microedition.rms.RecordStoreNotOpenException;
import org.kxml2.io.KXmlParser;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
public class KXMLliao extends MIDlet implements CommandListener{
private Display display;
private Form form;
private List choose = null;
private Command exitCommand = new Command("退出",Command.EXIT,1);
private Command viewCommand = new Command("浏览",Command.SCREEN,1);
private Command delCommand = new Command("删除",Command.SCREEN,2);
RecordStore rs = null;
public KXmlParser parser = new KXmlParser();
public KXMLliao() {
display = Display.getDisplay(this);
rs = openRS("XMLRS"); //创建记录存储
}
//读取网络上的xml文件
public void loadText() throws XmlPullParserException{
try{
String URL = "http://dev.mopietek.net:8080/waptest03/xiaochao.xml";
HttpConnection httpConnection = (HttpConnection) Connector.open(URL);
parser.setInput(new InputStreamReader(httpConnection.openInputStream(),"UTF-8"));
}catch(IOException e){
e.printStackTrace();
}
}
protected void startApp() throws MIDletStateChangeException {
try{
Interpret();
}catch(XmlPullParserException xpp){
}
display.setCurrent(form);
}
//解析XML文件
public void Interpret() throws XmlPullParserException{
form = new Form("解析XML");
form.addCommand(exitCommand);
form.addCommand(viewCommand);
form.setCommandListener(this);
String str3;
this.loadText(); //调用这个方法来加载网络上的XML文件
int eventType = parser.getEventType();
try{
while(eventType != XmlPullParser.END_DOCUMENT){
//如果当前标签为开始标签,且标签内容为person的话
if(eventType == XmlPullParser.START_TAG && parser.getName().equals("person")){
str3 = parser.getAttributeValue(0);
addNewData(str3);
//转到下一个标签
eventType = parser.nextTag();
//如果是ID标签
if(parser.getName().equals("name")){
//提取name标签的内容
str3 = parser.nextText();
addNewData(str3);
}
//转到下一个标签
eventType = parser.nextTag();
//如果是Text标签
if(parser.getName().equals("attack")){
//提取attack标签的内容
str3 = parser.nextText();
addNewData(str3);
}
}
eventType = parser.next();
}
}catch(IOException ioe){
ioe.printStackTrace();
}
form.append("解析XML文件完毕并且以存到RMS中!"+"\n" +"按浏览键可以浏览全部记录");
}
//加入记录到记录存储
//各个记录由字节数组表示,所以加入记录就意味着:把字节数组加入到记录存储
//synchronized代表同步,即同一时刻,保证只有一个线程对RecordStore进行操作
public synchronized void addNewData(String record){
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream daos = new DataOutputStream(baos);
try{
daos.writeUTF(record);
}catch(IOException ioe){
ioe.printStackTrace();
}
//把接收到的数据放到bytearr数组中
byte[] bytearr = baos.toByteArray();
try{
//加入记录到记录存储,该方法有三个参数,第一个是要加入的字节数组
//第二个是字节数组内的offset(位移),第三个指要加入的字节数目
rs.addRecord(bytearr, 0, bytearr.length);
System.out.println("加入到RMS中的数据:" + baos.toString());
}catch(RecordStoreException rse){
System.out.println(rse);
rse.printStackTrace();
}
}
public void commandAction(Command c, Displayable d) {
if(c == exitCommand){
try {
destroyApp(false);
} catch (MIDletStateChangeException e) {
e.printStackTrace();
}
notifyDestroyed();
}
else if(c == viewCommand){
System.out.println("准备调用相关函数浏览全部记录");
this.listItems();
}
else if(c == delCommand){
System.out.println("准备调用相关函数删除全部记录");
try {
this.closeRS();
} catch (RecordStoreNotOpenException e) {
e.printStackTrace();
} catch (RecordStoreException e) {
e.printStackTrace();
}
}
}
private RecordStore openRS(String fileName) {
try{
//打开fileName记录存储,第二个参数true代表如果记录存储不存在的话就创建新的记录存储
//如果为false值则引发RecordStoreNotFoundException异常
rs = RecordStore.openRecordStore(fileName, true);
System.out.println("已创建" + fileName + "记录存储");
}catch(RecordStoreException rse){
rse.printStackTrace();
}
return rs;
}
//遍历记录存储中的记录
public synchronized RecordEnumeration enumerate() throws RecordStoreNotOpenException{
return rs.enumerateRecords(null, null, false);
}
//列出全部记录信息
public void listItems(){
choose = new List("全部记录",Choice.IMPLICIT);
choose.addCommand(delCommand);
choose.addCommand(exitCommand);
choose.setCommandListener(this);
try{
RecordEnumeration re = enumerate();
while(re.hasNextElement()){
String theList = new String(re.nextRecord(),"UTF-8");
choose.append(theList, null);
}
}catch(Exception e){
e.printStackTrace();
}
display.setCurrent(choose);
}
protected void destroyApp(boolean unconditional)
throws MIDletStateChangeException {
System.out.println("关闭记录存储");
try{
closeRS();
}catch(Exception e){e.printStackTrace();}
}
protected void pauseApp() {
System.out.println("准备关闭记录存储");
display.setCurrent(null);
form = null;
try{
closeRS();
}catch(Exception e){
e.printStackTrace();
}
}
//关闭记录存储
public void closeRS() throws RecordStoreNotOpenException,RecordStoreException{
String fileName = rs.getName();
//检测记录存储中的记录总数,如果记录存储时空的则删除这个记录存储
if(rs.getNumRecords() == 0){
rs.closeRecordStore();
rs.deleteRecordStore(fileName);
System.out.println("已关闭" + fileName +"记录存储");
}else{
rs.closeRecordStore();
System.out.println("已关闭" + fileName +"记录存储");
}
}
}