现在的位置: 首页 > 综合 > 正文

解析XML 不用任何Jar包

2018年01月31日 ⁄ 综合 ⁄ 共 3267字 ⁄ 字号 评论关闭

首先,解析xml,我们不是解析字符串,而是把xml转换成byte。由byte进行截取节点里的内容。最后返回byte。将所有数据类型转换成最原始的数据类型。这样操作起来速度方面会提高很高。

获取XML节点主体方法

/**
 * 获取XML节点主体方法
 * @author slz 
 * 
 */
public class XMLString {

	//内容
	byte[] connect;
	
	//是否存在节点
	int flag = 1;
	
	//错误内容
	byte[] error;
	
	//每一个节点之后的XML内容
	byte[] xml;
	
	//	通用XML解析(字符数组方法)
	public void XMLNode(byte[] xmldoc, String XmlNodeName,int StartPos) throws Exception {
	    try{
	        boolean finded;
	        int p;
	        //XML总长度
	        int p0=xmldoc.length;
	        //头标签长度
	        int p1=XmlNodeName.length()+2;
	        //尾标签长度
	        int p2=p1+1;
	        int k=0;
	        //头标签在XML的坐标
	        int bpos=0;
	        //尾标签在XML的坐标
	        int epos=0;
	        
	        byte[] bTagbytes=new byte[p1];
	        byte[] eTagbytes=new byte[p2];
	        
	        bTagbytes[0]='<';
	        System.arraycopy(XmlNodeName.getBytes(), 0, bTagbytes, 1, XmlNodeName.length());
	        bTagbytes[p1-1]='>';
	        eTagbytes[0]='<';
	        eTagbytes[1]='/';
	        System.arraycopy(XmlNodeName.getBytes(), 0, eTagbytes, 2, XmlNodeName.length());
	        eTagbytes[p1]='>';
	        //查找开始标记
	        finded=false;
	        for(p=StartPos;p<p0-p2;p++){
	        	finded=false;
	        	if (xmldoc[p]=='<'){
	        		finded=true;
	        		for(k=0;k<p1;k++){
	        			if (xmldoc[k+p]!=bTagbytes[k]){
	        				finded=false;
	        				break;
	        			}
	       			}
	        	}
	       		if (finded){
	       			bpos=p+p1;
	       			break;
	       		}
	       	}
	        
	       	if (!finded){
	       		error="查找不到开始标记符".getBytes();
	       		//System.out.println(new String(error));
				flag = 0;
			}
	       	
	      	//查找结束标记
	       	finded=false;
	       	for(p=bpos;p<p0-p2;p++){
	       		finded=false;
	       		if (xmldoc[p]=='<' && xmldoc[p+1]=='/'){
	       			finded=true;
	       			for(k=0;k<p2;k++){
	       				if (xmldoc[k+p]!=eTagbytes[k]){
	       					finded=false;
	       					break;
	       				}
	       			}
	       		}
	       		if (finded){
	       			epos=p;
	       			break;
	       		}
	       	}
	       	
	       	if (!finded){
	       		error="查找不到结束标记符".getBytes();
	       		//System.out.println(new String(error));
				flag = 0;
			}
	       	//开始与结束标记中间无内容判断
			/*if (epos==bpos){
				error="查找结果为NULL".getBytes();
				System.out.println(new String(error));
				flag = 0;
			}*/
			byte[] dest = new byte[epos-bpos];
	       	System.arraycopy(xmldoc,bpos,dest,0,epos-bpos);
	       	
	       	connect = dest;
	       	
	       	byte[] xmlStr = new byte[p0-epos-p2];
	       	System.arraycopy(xmldoc,epos+p2,xmlStr,0,p0-epos-p2);
	    	xml = xmlStr;
	        
	    }catch (Exception ex){
	    	if(ex.getMessage()==null){
	    		error="出现异常".getBytes();
	    		System.out.println(new String(error));
	    	}
	    	flag = 0;
	    }
	}


	public byte[] getConnect() {
		return connect;
	}

	public void setConnect(byte[] connect) {
		this.connect = connect;
	}

	public byte[] getXml() {
		return xml;
	}

	public void setXml(byte[] xml) {
		this.xml = xml;
	}
	
	public int getFlag() {
		return flag;
	}

	public void setFlag(int flag) {
		this.flag = flag;
	}

	public byte[] getError() {
		return error;
	}

	public void setError(byte[] error) {
		this.error = error;
	}
	
}

Main:

public class Test {

	
	public static void main(String[] args) {
		
		try {
			
			String xmldoc = "<EdorDetails><EdorDetail>"+
    		"<Date></Date><OtherNo></Otherno><OperateType></OperateType><Money></Money><InsuaccBala></InsuaccBala>"+
    		"<Status></Status><Info></Info></EdorDetail><EdorDetail>"+
    		"<Date></Date><OtherNo></Otherno><OperateType></OperateType>"+
    		"<Money></Money><InsuaccBala></InsuaccBala><Status></Status><Info></Info>"+
    		"</EdorDetail></EdorDetails>";
			
			String sb = XmlNode(xmldoc,"EdorDetail",0);
			System.out.println(sb.replaceAll(",", "\r\n"));
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 获取XML节点内容
	 * @param xmldoc  XML内容
	 * @param XmlNodeName  节点名称
	 * @param NodeNum  获取第几个节点里的内容
	 * @return
	 * @throws Exception
	 */
	private static String XmlNode(String xmldoc, String XmlNodeName,int NodeNum) throws Exception{
		XMLString xml = new XMLString();
		
		xml.XMLNode(xmldoc.getBytes(), XmlNodeName, 0);
		
		int flag = xml.getFlag();
		
		StringBuffer sb = new StringBuffer();
		
		while(flag!=0){
			sb.append(new String(xml.getConnect()));
			xml.XMLNode(xml.getXml(), XmlNodeName, 0);
			flag = xml.getFlag();
			if(flag==0){
				break;
			}
			sb.append(",");
		}
		String xmlStr = sb.toString();
		
		if(NodeNum!=0){
			String[] str = xmlStr.split(",");
			if(NodeNum<=str.length&&NodeNum>=0){
				xmlStr = str[NodeNum-1];
			}
		}
		
		return xmlStr;
	}

}



抱歉!评论已关闭.