作者: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流媒体播放器抽出来的,大家凑合着看。
解释就这么简单。欢迎大家讨论。有啥需要讨论的东西,留言沟通