`
wuhua
  • 浏览: 2111235 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

一个简单的XML for J2ME

    博客分类:
  • J2ME
阅读更多

作者:wuhua
空间:htt://wuhua.3geye.net
转载请保留上面的信息(请尊重知识产品)谢谢

 

相信大家都用过Kxml的东西了,不过个人感觉kxml还是大了些。现在介绍一个比kxml跟简介的xml的类。对于一些小项目,或者对xml解释要求不是很高的项目来说却是个不错的选择。

下面看看那代码与Demo吧。

package org.gggeye.easymf.xml;

import java.util.Enumeration;
import java.util.Vector;

/**
 * 
 * @author wuhua
 * <a href="http://wuhua.3geye.net">我的博客</a>
 *
 */
 
public class XMLParser {
    private XMLNode root=null;
    private XMLNode exeNode=null;
    private int offset=0;
    private String xml="";
    private int xmlLength=0;
    private String version="1.1";
    private String encoding="UTF-8";
    public XMLParser(String xml){
        this.xml=xml;
        this.xmlLength=xml.length();
    }
    public char getNextCharacter(){
        char rt= xml.charAt(offset);
        offset++;
        return rt;
        
    }
    /** *//**
     * 判断下一字符是否为指定字符token
     * @param token
     * @return
     */
    private boolean match(char token){
        for(int i=offset;i<this.xmlLength;i++){
            char tc=xml.charAt(i);
            if (tc!=' '){
                if (tc==token){
                   return true;
                }else{
                   return false;
                }
            }
        }
        return false;
    }
    
    private String getDescription(){
        skipSpace();
        StringBuffer desc=new StringBuffer();
        while(offset<this.xmlLength-2){
            char tc1=this.getNextCharacter();
            if (tc1=='-'){
                if ((xml.charAt(offset)=='-')&&(xml.charAt(offset+1)=='>')){
                    offset+=2;
                    return desc.toString();
                }    
            }else{
                desc.append(tc1);
            }
        }
        return null;
        
    }
    /** *//**
     * 获取Node名称
     * @return
     */
    private String getNodeName(){
        skipSpace();
        char[] name=new char[120];// 
        int i=0;
        while(i<120){
            char tc=getNextCharacter();
            if ((tc==' ')||(tc=='>')||(tc=='/')){
                if (i>0)
                    return new String(name).trim();
            }else {   
                name[i]=tc;
                i++;
                if (i>120){
                    System.err.println("NODE NAME长度只能小于120");
                    return null;
                }
            }
        }
        return null;
    }
    
    /** *//**
     * 获取属性信息
     *
     */
    private void getAttributes(){
        skipSpace();
        StringBuffer name=new StringBuffer();
        StringBuffer value=new StringBuffer();
        boolean isAttribute=false;
        while(offset<this.xmlLength){
            char tc1=this.getNextCharacter();
            if (tc1=='='){
                skipSpace();
                char tc2=this.getNextCharacter();
                if (tc2=='"'){//获取属性值
                    isAttribute=true;
                    while(offset<this.xmlLength){
                        char tc3=this.getNextCharacter();
                        if (tc3=='"'){
                            this.exeNode.setAttribute(name.toString(),value.toString());
                            this.skipSpace();
                            value.delete(0,value.length());
                            name.delete(0,name.length());
                            break;
                        }else
                            value.append(tc3);
                    }
                }    
            }else if (tc1=='/'){
                skipSpace();
                char tc2=this.getNextCharacter();
                if (tc2!='>'){
                    System.err.println("/必须使用>来封闭");
                }else{
                    this.exeNode=this.exeNode.getParent();
                    break;
                }
            }else if (tc1=='>'){
                break;
            }else{
                name.append(tc1);
            }
        }        
    }

    private int skipSpace(){
        int skipCount=0;
        while(offset<xml.length()){
            char tc=xml.charAt(offset);
            if ((tc!=' ')&&(tc!=' ')&&(tc!=' ')){
                return skipCount;
            }else{
                offset++;
                skipCount++;
            }
        }
        return skipCount;
    }
    private String getValue(){
        StringBuffer value=new StringBuffer();
        value.append(xml.charAt(offset-1));
        while(offset<xml.length()){
            char tc=this.getNextCharacter();
            value.append(tc);
            if (xml.charAt(offset)=='<'){
                return value.toString().trim();
            }
        }
        return null;        
    }
    private void getXMLHeader(){
        this.skipSpace();
        if ((this.xml.charAt(offset)=='<')&&(this.xml.charAt(offset+1)=='?')){
                 int idx=this.xml.indexOf("version");
                 if (idx>0){
                     boolean start=false;
                     StringBuffer tmp=new StringBuffer();
                     for(int i=idx+8;i<this.xmlLength;i++){
                         char tc=this.xml.charAt(i);
                          if (tc=='"'){
                              if (start==false){
                                  start=true;
                              }else{
                                  break;
                              }
                          }else{
                              if (start)
                                 tmp.append(tc);
                          }
                     }
                     this.version=tmp.toString();
                     
                 }
                 idx=this.xml.indexOf("encoding");
                 if (idx>0){
                     boolean start=false;
                     StringBuffer tmp=new StringBuffer();
                     for(int i=idx+9;i<this.xmlLength;i++){
                        char tc=this.xml.charAt(i);
                         if (tc=='"'){
                            if (start==false){
                                start=true;
                            }else{
                                break;
                            }
                         }else{
                            if (start)
                               tmp.append(tc);
                         }
                     }
                     this.encoding=tmp.toString();
                 }
                 int end=this.xml.indexOf("?>");
                 offset=end+2;
            }    
            
    }
    public XMLNode parse(){
        getXMLHeader();
        while(offset<this.xmlLength){
            this.skipSpace();
            char token=getNextCharacter();
            if (token=='<'){
              if (match('!')){
                  getNextCharacter();
                     char tc=getNextCharacter();
                     if (tc=='-'){
                        tc=getNextCharacter();
                        if (tc=='-'){
                           //System.out.println("注释行");
                           String desc=getDescription();
                           if (this.exeNode!=null)
                            this.exeNode.setDescription(desc);
                        }else{
                           System.err.println("语法错误在"+offset);   
                           return null;
                        }   
                     } 
               }else if (match('/')){
                     String nodeName=this.getNodeName();
                     if (exeNode.getName().equalsIgnoreCase(nodeName))
                           exeNode=exeNode.getParent();
                     else{
                           System.err.println("期望封闭标签为:"+exeNode.getName()+",实际标签为:"+nodeName);
                           return null;                    
                     }
               }else{
                  String name=this.getNodeName();
                  XMLNode newNode=new XMLNode(name);
                  if (root==null){
                     root=newNode;
                     exeNode=root;
                  }else{
                     exeNode.addChild(newNode);
                     exeNode=newNode;
                  }
                  char tc=this.xml.charAt(offset-1);
                  if (tc==' ')
                       getAttributes();
                  else{
                       if (tc!='>')
                          System.err.println(exeNode.getName()+"期待关闭");
                  }
               }
            }else{
                exeNode.setValue(getValue());
            }
        }
        return root;
            
    }
    public static void main(String[] args){
        String xml="<?xml version=\"1.0\" encoding=\"GB2312\"?>" +
        		"<!--注释行--><root desc=\"一个测试的例子\"><book name=\"test\" " +
        		"value=\"我的\"/><book name=\"跌而\">我的值</book></root>";
        XMLParser parser=new XMLParser(xml);
        XMLNode root=parser.parse();
        System.out.println(root.getName());
        
        Vector nodes = root.getChildNodes();
        load(nodes);
        
        
       // System.out.println(root.toString());
    }
    
    static void load(Vector _nodes){
    	 
    	 System.out.println(_nodes);
    	 
    	 for(int i=0; i<_nodes.size(); i++){
    		 XMLNode tNode = (XMLNode) _nodes.elementAt(i);
    		 System.out.println(tNode.getName());
    		 Enumeration keys=tNode.getAttributes().keys();
    	        while(keys.hasMoreElements()){
    	            String key=(String)keys.nextElement();
    	            
    	            String value= tNode.getAttribute(key);
    	            System.out.println(" "+ key+ "=" + value + " ");
    	        }
    	        System.out.println(tNode.getValue());
    	 }
    }
}

 

package org.gggeye.easymf.xml;

import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Vector;



/**
 * XML Node 
 * @author wuhua
 * <a href="http://wuhua.3geye.net">我的博客</a>
 *
 */

public class XMLNode {
    private String name;
    private XMLNode parent;
    private String value;
    private String description;
    private Hashtable attributes=new Hashtable();
    private Vector childNodes=new Vector();
    public XMLNode(String name){
        this.name=name;
    }
    
    public String getName(){
        return this.name;
    }
    public void setName(String name){
        this.name=name;
    }
    public String getValue(){
        return this.value;
    }
    public void setValue(String value){
        this.value=value;
    }
    public void setAttribute(String name,String value){
        this.attributes.put(name,value);
    }
    public String getAttribute(String attributeName){
        return (String)attributes.get(attributeName);
    }
    public void setDescription(String desc){
        this.description=desc;
    }
    public String getDescription(){
        return this.description;
    }
    public void setParent(XMLNode parent){
        this.parent=parent;
    }
    public XMLNode getParent(){
        return this.parent;
    }
    public void addChild(XMLNode childNode){
        this.childNodes.addElement(childNode);
        childNode.setParent(this); 
    }
    
    public String toString(){
        StringBuffer xml=new StringBuffer();
        if ((this.getDescription()!=null)&&(this.getDescription().length()>0))
           xml.append("<!--"+this.getDescription()+"--> ");
        xml.append("<");
        xml.append(this.getName());
        
        Enumeration keys=this.attributes.elements();
        while(keys.hasMoreElements()){
            String key=(String)keys.nextElement();
            String value=(String)this.attributes.get(key);
            xml.append(" "+ key+ "=" + value + " ");
        }
        if (((this.getValue()==null)||(this.getValue().length()==0))&&(this.childNodes.size()==0)){
           xml.append(" /> ");
        }else{
           xml.append(" >");
           if ((this.getValue()!=null)&&(this.getValue().length()>0)){
                   xml.append(this.getValue());
           }        
           for(int i=0;i<this.childNodes.size();i++)
             xml.append(((XMLNode)this.childNodes.elementAt(i)).toString());
           xml.append("</"+this.getName()+"> ");         
        }
        return xml.toString();
    }

	public Hashtable getAttributes() {
		return attributes;
	}

	public Vector getChildNodes() {
		return childNodes;
	}
}

 类就两个。很简单

看看Demo吧。

 

String _res = Tools.toUTFString(Tools.read(this.getClass().
							 getResourceAsStream(_url)));
					 XMLParser tXMLParser = new XMLParser(_res);
					 XMLNode tXMLNode= tXMLParser.parse();
					 PlayerItem tMp4 = new PlayerItem(tXMLNode.getAttribute("name"), tXMLNode.getAttribute("encode"));
			    	 for(int i=0; i<tXMLNode.getChildNodes().size(); i++){
			    		 XMLNode tNode = (XMLNode) tXMLNode.getChildNodes().elementAt(i);
			    		 
			    		 tMp4.addQueue(tNode.getValue());
			    	 }

			    	 PlayerPanel tMP4Panel = new PlayerPanel(tMp4, getPlayerList());
					 tMP4Panel.show();

上面的例子是我从自己实现了一个J2ME流媒体播放器抽出来的,大家凑合着看。

 

解释就这么简单。欢迎大家讨论。有啥需要讨论的东西,留言沟通

分享到:
评论

相关推荐

    xml.rar_j2me_j2me xml_java xml_xml j2me

    标题"xml.rar_j2me_j2me_xml_java_xml_j2me"暗示了这是一个针对J2ME平台的XML处理解决方案,可能包含轻量级的解析器和示例应用。 描述中提到的"j2me上的微型解析器"指的是专为J2ME设计的XML解析库,旨在在内存有限...

    Jaxp_xml.rar_J2ME 程序_j2me_j2me xml_j2me 网络

    标题"Jaxp_xml.rar_J2ME程序_j2me_j2me_xml_j2me网络"表明这个压缩包包含了一个示例,演示如何使用JAXP(Java API for XML Processing)在J2ME环境中解析XML文件。JAXP是Java平台上的一个标准接口,用于处理XML文档...

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

    **标题:“kuixdemo-1.0.0 (J2ME下解析xml文件)”,意味着这是一个专门用于在Java 2 Micro Edition (J2ME)环境中解析XML文件的示例程序。** **描述:“在J2ME下对XML文件进行解析的示例源码及帮助文件”指出,该...

    j2me手机高级编程

    5. **持久化应用**:在J2ME中,持久化数据存储可以通过Record Management System(RMS)实现,这是一个简单的键值对存储系统。开发者也可以使用文件系统或SQLite数据库(如JSR-172)进行更复杂的数据管理。 6. **...

    j2me版wap浏览器源码

    KXML是一个轻量级的XML解析库,专为Java ME(J2ME)和Android平台设计。在J2ME版WAP浏览器中,KXML用于解析WAP服务器返回的XML数据,这些数据通常包含网页的结构和内容。KXML提供了DOM(Document Object Model)和...

    j2me移植android

    总结来说,J2ME应用移植到Android是一项涉及多方面工作的任务,需要对两个平台的特性有深入理解。虽然过程可能会遇到挑战,但通过合理规划和逐步实施,可以成功地将J2ME应用带到更广泛的Android用户群体中。提供的...

    J2ME-1.rar_J2ME开发_j2me

    J2ME通过JSR 82(Java API for Bluetooth Wireless Technology)和JSR 118(Java API for XML Processing, JAXP)等规范支持网络和蓝牙通信。MIDP 2.0引入了HttpConnection接口,允许应用程序通过HTTP协议发送请求和...

    基于J2ME_MobileSVG的校园地图设计与实现

    TinyLine SDK是一个开源项目,专门为J2ME平台设计,能够高效地解析和渲染MobileSVG文件。 3. **XML属性文件的解析**:地图的属性数据采用XML文件存储,客户端通过KXML 2.0开发包进行解析。KXML是一款轻量级的XML...

    Sample J2ME code for GPS

    J2ME,全称Java 2 Micro Edition,是Java平台的一个子集,主要用于嵌入式设备和移动设备的开发,如早期的智能手机和平板电脑。在J2ME中,开发人员可以构建功能丰富的应用程序,其中包括使用GPS(全球定位系统)功能...

    eclipse j2me插件

    Eclipse J2ME插件是Eclipse集成开发环境(IDE)的一个扩展,专门用于支持Java 2 Micro Edition(J2ME)应用的开发。J2ME是Java平台的一个子集,设计用于资源有限的设备,如移动电话、智能手表和嵌入式系统。通过这个...

    Cobertura for J2ME-开源

    J2ME是Java的一个子集,用于开发和部署在移动设备、消费电子设备和嵌入式系统上的应用程序。它由Connected Limited Device Configuration (CLDC) 和 Mobile Information Device Profile (MIDP) 组成,CLDC提供了基本...

    j2me手册-webservice_mobile_wtk

    开发者可以利用J2ME的JAX-RPC(Java API for XML-RPC)或者KXML库来构建和消费Web服务。理解XML解析、HTTP通信以及如何封装和解封装SOAP消息是实现J2ME Web服务的关键。 二、API J2ME提供了一系列的API,如MIDP...

    J2ME API 速查手册0.7

    J2ME Web Services XML (JSR 172) Java APIs for Bluetooth (JSR 82) Location API (JSR 179) MID Profile 2.0 (JSR-118) Mobile Media API 1.1 (JSR-135) Mobile 3D Graphics API (JSR184) PDA Pim 1.0...

    j2me基础教程开发大全

    Java 2 Micro Edition(J2ME)是Java平台的一个重要组成部分,专门设计用于在嵌入式设备、移动电话和智能家电等资源有限的环境中运行应用程序。本教程旨在为初学者提供全面的J2ME学习资源,帮助他们快速掌握J2ME开发...

    J2ME_7_skills.rar_j2me

    Java 2 Micro Edition(J2ME)是Java平台的一个子集,主要用于开发在移动设备、嵌入式系统等资源有限的环境中的应用程序。作为一个初学者,掌握J2ME编程的七种关键技术对于踏入这个领域至关重要。以下将详细解释这些...

    j2me处理xml的jar包(kxml2-2.3.0.jar)

    "j2me处理xml的jar包(kxml2-2.3.0.jar)"是专为J2ME环境设计的一个轻量级XML解析库,它允许开发者在资源有限的移动设备上有效地解析和生成XML文档。这个库的名称为KXML2,版本号为2.3.0,提供了与Java标准版(Java ...

    j2me-API.rar_bluetooth_j2me api 中文

    J2ME Web Services XML (JSR 172) Java APIs for Bluetooth (JSR 82) Location API (JSR 179) MID Profile 2.0 (JSR-118) Mobile Media API 1.1 (JSR-135) Mobile 3D Graphics API (JSR184) PDA Pim 1.0 (JSR ...

    J2ME 学习教程幻灯片

    此外,J2ME的用户界面通常基于Wireless Toolkit(WTK)进行开发,这是一个强大的模拟器,允许开发者在没有实际设备的情况下测试MIDlets。WTK提供了一系列工具,包括编译器、模拟器和设备配置文件,以适应不同的移动...

    j2me编程Google地图实现经代码

    J2ME提供了JSR-82(Java Wireless Technology SDK for Bluetooth)规范,它包含了一个API用于访问蓝牙和无线定位服务,包括GPS。 **6. 定位和路径规划** 使用GPS数据,我们可以确定设备的当前位置。结合Google Maps...

    M2MXML for J2ME-开源

    "org"目录通常代表了一个Java包结构,其中可能包含了解析器的源代码文件。在这个目录下,我们可能会找到与M2MXML解析相关的类,如XML解析器类、节点处理类、事件驱动模型实现等。通过查看这些源码,开发者可以学习到...

Global site tag (gtag.js) - Google Analytics