`
wangxc
  • 浏览: 210479 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

    博客分类:
  • J2ME
阅读更多
J2ME从服务器解析并读取xml文件,其实跟在本地读取xml文件相似,只是我们在下载服务器的xml时,需要注意将xml转码为“UTF-8”,服务器的xml文件跟我上次写的xiaochao.xml文件内容一样,所以这里就不再写了,大家可以去看上一期的博客,代码如下:



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

}


  • 大小: 4.1 KB
分享到:
评论

相关推荐

    J2ME+servlet+mysql查询数据

    2. Servlet通过`request.getInputStream()`读取请求体数据,解析出参数。 3. 调用`checkData()`方法,检查参数是否为空。 4. 如果参数非空,使用JDBC连接MySQL数据库,执行查询操作。 5. 处理查询结果,可能包括遍历...

    在J2ME平台上构建你的邮件程序

    8. **XML解析**:邮件头信息可能以XML格式存储和传输,因此教程中提到了XML解析。`HeadParser`类可能实现了这一功能,允许程序读取和理解邮件头部信息。 9. **用户界面设计**:J2ME的`javax.microedition.lcdui`包...

    搭建OTA下载服务器.doc

    6. 服务器返回JAR文件,设备开始接收并存储。 7. JAR文件接收完成后,设备自动或手动启动安装过程。 除了上述基础设置,搭建完整的OTA服务器还需考虑更多实际问题,例如: - **安全性**:确保下载过程安全,防止...

    java源码包3

     数字证书:从文件中读取数字证书,生成文件输入流,输入文件为c:/mycert.cer,获取一个处理X.509证书的证书工厂…… Java+ajax写的登录实例 1个目标文件 内容索引:Java源码,初学实例,ajax,登录  一个Java+ajax...

    JAVA上百实例源码以及开源项目

     数字证书:从文件中读取数字证书,生成文件输入流,输入文件为c:/mycert.cer,获取一个处理X.509证书的证书工厂…… Java+ajax写的登录实例 1个目标文件 内容索引:Java源码,初学实例,ajax,登录  一个Java+ajax写...

    java源码包---java 源码 大量 实例

     数字证书:从文件中读取数字证书,生成文件输入流,输入文件为c:/mycert.cer,获取一个处理X.509证书的证书工厂…… Java+ajax写的登录实例 1个目标文件 内容索引:Java源码,初学实例,ajax,登录  一个Java+ajax写...

    java源码包2

     数字证书:从文件中读取数字证书,生成文件输入流,输入文件为c:/mycert.cer,获取一个处理X.509证书的证书工厂…… Java+ajax写的登录实例 1个目标文件 内容索引:Java源码,初学实例,ajax,登录  一个Java+ajax...

    java源码包4

     数字证书:从文件中读取数字证书,生成文件输入流,输入文件为c:/mycert.cer,获取一个处理X.509证书的证书工厂…… Java+ajax写的登录实例 1个目标文件 内容索引:Java源码,初学实例,ajax,登录  一个Java+ajax...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    Java从网络取得文件 1个目标文件 简单 Java从压缩包中提取文件 1个目标文件 简单 Java存储与读取对象 1个目标文件 如题 Java调色板面板源代码 1个目标文件 摘要:Java源码,窗体界面,调色板 使用Java语言编写的一款...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    Java从网络取得文件 1个目标文件 简单 Java从压缩包中提取文件 1个目标文件 简单 Java存储与读取对象 1个目标文件 如题 Java调色板面板源代码 1个目标文件 摘要:Java源码,窗体界面,调色板 使用Java语言编写的一款...

    JAVA上百实例源码以及开源项目源代码

     数字证书:从文件中读取数字证书,生成文件输入流,输入文件为c:/mycert.cer,获取一个处理X.509证书的证书工厂…… Java+ajax写的登录实例 1个目标文件 内容索引:Java源码,初学实例,ajax,登录  一个Java+ajax写...

    Ja va/J2EE 面试资源大全

    - **XML**:用于数据交换和配置文件,解析器如DOM、SAX、StaX等。 - **分页和效率**:分页查询减少内存占用,优化SQL语句提高性能。 - **Struts**:MVC框架,提供动作调度和表单验证等。 - **XML在项目中的作用*...

    Java面试宝典 介绍了Java面试的试题

    - 表单验证、SSL、MVC模式、XML解析、分页、编码规范、多线程、文件加密、软件生命周期等都是面试中常见的技术点。 这些只是Java面试宝典中的一部分内容,实际面试中还会涉及到更多Java语言特性、框架、设计模式...

    Java面试题大全

    - `java.io.File`类用于文件和目录的管理,`listFiles()`列出目录下所有文件和子目录,`exists()`判断文件是否存在,`read()`和`write()`进行文件读写。 5. **多态**: - 实现多态主要通过继承、重载(方法名相同...

    JAVA笔试题集合版不错

    - XML用于数据交换和配置,XML Schema定义数据结构,DOM和SAX解析XML。 - 分页通常结合数据库查询实现,效率优化包括缓存、索引等。 - Struts的工作流程包括Action、ActionForm、Dispatcher Servlet等组件交互。 ...

    JAVA程序员面试题收集.doc

    - XML用于数据交换和配置,解析XML可使用DOM、SAX或StaX。 这只是Java面试题的一部分,完整的面试可能会涵盖更多主题,如设计模式、并发编程、框架(如Spring、Hibernate)等。面试题的解答能够展示面试者的技能...

    JAVA程序员面试题

    3. 通过request对象读取客户端请求,通过request.getParameter()访问CGI变量,使用pageContext对象获取JSP文件的路径。 4. Cookie用于客户端持久化数据,Session用于服务器端跟踪用户状态。Session基于cookie,但不...

    Android 40 道面试题及答案.docx

    PULL 方式常常用在 J2ME 对于节点处理比较好,类似 SAX 方式,同样很节省内存,在 J2ME 中我们经常使用的 KXML 库来解析。 ListView 的优化方案包括:如果自定义适配器,那么在 getView 方法中要考虑方法传进来的...

    JAVA面试常见问题大全及解答.docx

    以上仅是部分要点,完整的面试准备还需要深入理解每个主题的细节,例如MVC架构、XML解析、EJB生命周期、并发编程、网络协议、GUI设计、软件工程等方面的知识。对于JSP和Servlet,理解请求处理、响应生成、会话管理、...

Global site tag (gtag.js) - Google Analytics