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