J2ME从服务器解析并读取xml文件

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]


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 +"记录存储");
}

}


}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值