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

相关推荐

    xml.rar_j2me_j2me xml_java xml_xml j2me

    学习和理解这个微型解析器的实现,开发者可以了解如何在资源受限的环境中高效地处理XML,这对于开发J2ME应用尤其是需要与服务器交换XML数据的应用至关重要。同时,这也是一种深入理解XML解析原理和Java编程技巧的好...

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

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

    Jaxp_xml.rar_J2ME 程序_j2me_j2me xml_j2me 网络

    3. **XML文档流式处理**:SAX解析器按需读取XML文档,允许J2ME应用处理大型XML文件,而不会消耗大量内存。 4. **错误处理**:SAX解析器还会触发错误事件,允许开发者捕获并处理XML解析中的错误。 5. **实际应用**...

    J2me 实现 wap 1.0 的解析

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

    j2me wml 解析

    标题与描述中的“j2me wml 解析”是指在Java 2 Micro Edition(J2ME)平台上对Wireless Markup Language(WML)的解析处理。J2ME是Sun Microsystems为资源有限的设备如手机、PDA等设计的Java平台版本,而WML是一种...

    j2me-xmlrpc.rar

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

    j2me http通信demo

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

    用J2ME与ASP建立数据库连接.rar_http in j2me_j2me_j2me 3d_j2me asp

    `获取服务器响应,并读取内容。可能需要解析HTTP响应头以获取状态码,确认请求是否成功。 5. **处理ASP页面**:ASP页面接收到请求后,根据请求的内容执行相应的数据库操作,如SQL查询或更新。这通常涉及到ADO.NET或...

    解析用于J2ME开发平台的Web服务API 解析用于J2ME开发平台的Web服务API

    为了在这些设备上实现Web服务功能,Java Community Process (JCP) 定义了Java规范请求 172 (JSR 172),即Web服务API(WSA),它为J2ME提供了一套API,用于远程服务调用和XML解析。 **一、Web服务API的基础** JSR ...

    基于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_RSSreader.zip_阅读器

    1. **XML解析**:由于RSS数据是XML格式,所以需要一个XML解析器来读取和理解数据结构。J2ME提供了一个轻量级的XML解析库,叫做KXML,适用于资源有限的设备。 2. **网络通信**:使用J2ME的`javax.microedition.io....

    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应用,尤其是那些需要网络功能的应用至关重要。

Global site tag (gtag.js) - Google Analytics