java 解析xml 递归算法 简单实用

(优化深层解析)有问题请给我留言吧,或者加我QQ114846108,jdk版本1.6以上 引入jdom.jar
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.StringReader;
import java.util.List;

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.Namespace;
import org.jdom.input.SAXBuilder;
import org.xml.sax.InputSource;

public class XmlNodeAnalysiser {
	/**
	 * 解析文档xml
	 * @param interfaceName
	 * @return
	 * @throws JDOMException
	 * @throws IOException
	 */
	public void getXmlDoc(String xmlFile) throws JDOMException, IOException{
		File file = new File(xmlFile);//"注:输入文件路径",输入您的文件url,找到该xml文件
		FileInputStream fis = new FileInputStream(file);//以文件流形式读入xml文件
        int size = fis.available();
        byte[] buffer = new byte[size];//初始化文件流byte数字
        fis.read(buffer);//读取文件数据导数组中
        fis.close();//关闭文件流
		//创建一个新的字符串
		StringReader read = new StringReader(new String(buffer,"UTF-8"));//将xml的文件流以某种格式转换为字符串,此处为UTF-8
		//创建org.xml.sax.InputSource对象,以便使用SAXBuilder
		InputSource source = new InputSource(read);
		//创建一个新的SAXBuilder
		SAXBuilder sb = new SAXBuilder();
		//通过输入源构造一个Document
		Document doc = sb.build(source);
		//取的根元素
		Element root = doc.getRootElement();
		System.out.println(root.getName());//输出根元素的名称
		//得到根元素所有子元素的集合
		List jiedian = root.getChildren();
		//获得XML中的命名空间(XML中未定义可不写)
		Namespace ns = root.getNamespace();
		
		loopXmlEle(jiedian);//递归算法,进入正题
	
	}
	/**
	 * 利用递归调用
	 * @param jiedian 开始解析xml节点,就是从哪个标签开始向下解析
	 */
	private void loopXmlEle(List jiedian){
		int thisListSize = jiedian.size();
		List zjd = null;
		if(thisListSize!=0){//判断若没有数据直接结束
			Element et = null;
			Element et1 = null;
			for(int i=0;i<thisListSize;i++){
				et = (Element) jiedian.get(i);//得到该层数据
			    System.out.println("父节点"+et.getName());
			    if("Row".equals(et.getName())){//注意这里这个"Row"代表你想要递归到xml节点的那一层级,如 Table下有Row,Row下有Cell,你如果想得到每一个Row里面的Cell,就写Row。
			    	zjd = et.getChildren();//("Row"是我想要的,所以进来)
		            for(int j=0;j<zjd.size();j++){//遍历Row层级
		            	et1 = (Element) zjd.get(j);
		            	System.out.println("叶子节点"+et1.getName()+"="+et1.getValue());//这里是末级节点了,如果你下面还有节点,可以继续写循环,这里不做举例了,有问题联系我QQ:114846108
		            }
			    }else{
			    	loopXmlEle(et.getChildren());//如果不是“Row”(你想要的节点,则继续递归调用)。调用自身的时候,传入的是et的Children(下一个层级)
			    }
			}
		}
		
	}
	
}



    原文作者:递归算法
    原文地址: https://blog.csdn.net/heliangb46/article/details/50478918
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞