一个简单的XML for 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,.net)