(优化深层解析)有问题请给我留言吧,或者加我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(下一个层级)
}
}
}
}
}