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