`
wangxc
  • 浏览: 210520 次
  • 性别: 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
分享到:
评论

相关推荐

    kuixdemo-1.0.0(J2ME下解析xml文件)

    通过这些资源,开发者可以学习如何在J2ME环境中读取、解析XML数据,并理解如何处理XML事件,创建XML解析器,以及如何将解析后的数据应用于实际应用。这对于开发需要与服务器交换XML数据的J2ME应用程序,如游戏、信息...

    J2me 实现 wap 1.0 的解析

    它提供了一个事件驱动的解析模型,允许程序逐个读取XML文档的元素,而无需一次性加载整个文档到内存中,这大大节省了资源。 实现J2ME中的WAP 1.0解析过程可以分为以下步骤: 1. **导入XMLPull库**: 首先,你需要将...

    j2me-xmlrpc.rar

    服务器解析XML文档,执行相应的方法,并返回同样格式的XML响应。这种简单而通用的机制使得XML-RPC能够在多种语言和平台上实现互操作。 3. **J2ME实现XML-RPC的步骤** - **建立连接**:J2ME程序首先需要创建一个...

    j2me http通信demo

    在Java 2 Micro Edition (J2ME) 平台上,HTTP通信是开发移动应用程序时一个常见且重要的功能,尤其在需要从服务器获取数据或者发送数据到服务器的应用中。本示例是一个关于J2ME实现HTTP通信的演示项目,旨在帮助...

    基于j2me的手机rss阅读器

    3. **XML解析**:由于RSS订阅源是XML格式,所以需要使用J2ME的XML解析器,如KXML或TinyXML,来解析RSS feed并提取相关信息。解析过程包括解析XML文档结构、定位元素和提取属性值。 4. **UI设计**:J2ME的用户界面...

    j2me的wap浏览器

    3. **接收响应**:从服务器读取响应,通常包含WML或XHTML-MP内容。 4. **解析页面**:使用XML解析器(如KXML库)解析接收到的数据。WML是一种基于XML的语言,而XHTML-MP是XHTML的简化版本,适用于移动设备。 5. **...

    J2ME+servlet+mysql查询数据

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

    j2me实现手机QQ源代码

    这些数据可能包括JSON、XML或者自定义格式,都需要进行解析和解码。 2. **数据加密**:为了保护用户的隐私和信息安全,手机QQ的通信数据通常会进行加密。J2ME提供了一些基础的加密库,如`javax.crypto`包,包含加密...

    j2me-ws.rar

    总之,"j2me-ws.rar" 文件是一个与 J2ME 平台上实现 Web 服务功能相关的资源包,包含了可能的库、示例代码、工具以及帮助文档,旨在支持开发者在小型设备上构建能够与服务器进行交互的应用程序。

    J2me自动登录的源代码

    在登录时,程序会从RMS中读取这些信息,如果存在则自动填充到登录字段。 2. **用户界面(UI)设计**:J2ME的UI构建通常使用MIDP (Mobile Information Device Profile) 提供的Canvas或Form组件。对于自动登录,需要...

    J2ME机票预订系统

    查询算法需要根据输入的出发地、目的地和时间等条件,从服务器获取并展示符合条件的航班信息。预订过程则涉及验证用户信息、确认座位可用性、生成订单等步骤,这些都需要在服务器端完成,而J2ME客户端主要负责显示...

    基于j2me的在线天气预报程序

    如果是XML数据,可以使用`javax.xml.parsers`包中的SAX或DOM解析器。 在解析完天气数据后,J2ME程序需要将这些信息以友好的方式展示在移动设备的屏幕上。这涉及到用户界面的设计,J2ME提供了Midlet类作为应用程序的...

    j2me 关于网络连接的代码

    在Java 2 Micro Edition (J2ME) 中,网络连接是通过特定的API来实现的,这使得...这个过程包括设置请求方法、发送SOAP消息、接收并解析响应。了解这些知识对于开发J2ME应用,尤其是那些需要网络功能的应用至关重要。

    J2ME 手机通讯录实现(部分)

    - **XML或JSON解析**:在网络通信中,数据通常以XML或JSON格式交换,J2ME可以通过内置的DOM或第三方库解析这些格式。 6. **性能优化** - **内存管理**:由于J2ME设备资源有限,需要注意内存占用,合理使用对象池...

    kxml2_doc_src

    KXML2广泛应用于J2ME和Android的移动开发中,例如在游戏开发中存储和加载配置文件、在移动应用中解析服务器返回的XML数据等。此外,由于其轻量级的特性,KXML2也常被用于物联网设备、嵌入式系统等领域。 六、最佳...

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

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

    非常好的J2ME地图源代码.rar

    8. **网络通信**:如果地图数据是从服务器动态加载的,源代码还需要处理HTTP请求和响应,可能还涉及到JSON或XML的解析。 9. **性能优化**:考虑到J2ME的运行环境,源代码可能会采用各种优化技术,如代码混淆、资源...

    搭建OTA下载服务器.doc

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

    J2me自动登录的源代码实例.rar

    3. **JSON或XML解析**:服务器通常会返回一个包含登录结果的JSON或XML响应。在Java ME中,可以使用开源库如json.org的JSON库或kXML库进行解析,提取登录成功与否的信息。 4. **线程管理**:网络操作应在单独的线程...

    手机移动平台KXML的资源包

    在J2ME开发中,KXML通常用于网络通信,如接收和解析服务器返回的XML数据。这是因为XML常被用作数据交换格式,尤其在Web服务和API中。通过KXML,开发者可以轻松地将这些XML数据转换为Java对象,从而进行进一步的处理...

Global site tag (gtag.js) - Google Analytics