`

dom4j递归遍历xml文件,适合各种复杂的xml文件

阅读更多

今天项目需要完成一个xml数据导入的功能。第一步就是解析上传的xml文件。本来想用SAX来解析的,可是看到要导入的xml文件,心一下子就凉了,文件节点格式没有丝毫的规律可言,退而求其次,决定使用dom4j解析。
其实感觉dom4j还是比较简单的,和正常的思维更加贴切。导入dom4j-1.6.1.jar后开始敲代码。
在这里xml文件就不贴出来了,比较长,结构很复杂。
这里讲一下dom4j的基本思路:先读xml文件,生成一个document实例。代码如下:
      SAXReader reader = new SAXReader();
      Document document = reader.read(filePath);//读取xml文档
得到文档的根节点:
       Element root = document.getRootElement();//得到xml文档根节点元素
获取根节点的子节点:
       List<Element> elementList = root.elements();
得到子节点之后就是自由发挥的时候了,比如遍历子节点得到子节点的结点名称和节点的值。
       Iterator<Element> it = elementList.iterator();
while (it.hasNext()){
Element element = it.next();
System.out.println("节点的名称" + element.getName() + "节点的值" + "element.getText()");

   }
上面都是基本的操作,简单讲一下,在这里主要讲的是无论在xml文件有多么复杂的情况下,只要xml文件是合法的,那么都可以一次性的解析出xml文件的节点名称和节点的值。
给出这个问题后,很自然的会想到递归,虽然屡次提醒自己,不要使用递归,但是在这里,递归真正的起到了苦口良药的作用。下面就是我的代码。

package com.love.uilts.xml;

import java.io.File;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

/**
*
* @author Administrator
* 采用Dom4j解析复杂的xml文件
*
*/
public class Dom4jParseXml {

/**
* Dom4j解析xml文件的代码片段
* @throws DocumentException
*/

//设置数据存储格式Map

private static Map<String , String> map = new HashMap<String, String>();

public static Map parseXml(File filePath) throws DocumentException{

Map<String , String> mapEle = new HashMap<String, String>();
//StringBuffer sb = new StringBuffer();
SAXReader reader = new SAXReader();
    Document document = reader.read(filePath);//读取xml文档
    Element root = document.getRootElement();//得到xml文档根节点元素,即最上层的"<xml>"
    //System.out.println("输出根节点元素的名字===" + root.getName());
   
    //循环遍历出更节点下面的子节点
    List<Element> elementList = root.elements();
   
   Iterator<Element> it = elementList.iterator();
   while (it.hasNext()){
   Element element = it.next();
  // System.out.println(element);
   mapEle = printEle(element);

   }
return mapEle;
}


public static Map printEle(Element ele){
//StringBuffer sb = new StringBuffer();
if(ele.elements().size()==0){

System.out.println("该节点没有子节点,打印出节点名称" + ele.getParent().getName() +"打印出节点的值" + ele.getText());
map.put(ele.getParent().getName() , ele.getText());
}
else{
List<Element> elementList = ele.elements();
Iterator<Element> it = elementList.iterator();
while(it.hasNext()){

printEle(it.next());
}
  
}
return map;
}
/**
* @param args
* 功能测试
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
File file = new File("d:/datafeature@iso19115@we66zihsdb.xml");
Map<String , String> mapEleList = new HashMap<String, String>();
//StringBuffer sb = new StringBuffer();
try {
mapEleList = Dom4jParseXml.parseXml(file);

//遍历map

Iterator<Entry<String, String>> it = mapEleList.entrySet().iterator();
while(it.hasNext()){

Entry<String , String> entry = it.next();

System.out.println(entry.getKey() +"-------"+entry.getValue());
}
//System.out.println(sb.toString());

} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}

}

上面代码中标成蓝色的代码片段就是一个递归方法,方法会判断,当前访问的节点有没有子节点,如果没有子节点,就将节点名称以及节点值存放到map中,如果存在子节点,那么继续调用该方法去判断该节点的子节点有没有子节点,如果没有就将该节点的子节点的节点名称和节点值存放到ap中,如果存在子节点,则继续调用该方法,知道所有不存在子节点的节点的节点名称和节点值都被存放到map中。

个人觉得这个递归方法还是比较有参考价值的。

分享到:
评论
2 楼 qwer120158285 2013-11-04  
果然,当xml里面有重复的标签,直接这样存入hashMap前面的标签内容会被后面的覆盖掉
1 楼 qwer120158285 2013-11-04  
如果xml节点中有多个重复的标签,但对应了不同的值。就这样存入hashMap会不会有什么不妥哦

相关推荐

    Dom4j遍历解析XML

    这是一个Dom4j解析XML的例子,为做复杂递归处理前期所写的例子。涵盖了XML的解析方面大部分核心API。

    dom4j 解析(读取) xml 节点数据

    此方法解析xml时,不受xml层级的限制。文件中包含了说明文档,java类,以及所使用到的*.jar。并对代码做了注释让你一目了然……

    Xml的递归遍历

    用java递归dom解析器解析遍历Xml文档

    Javascript格式化并高亮xml字符串的方法及注意事项

    两个关键点 1.使用DOMParser解析xml 2.递归遍历xml树,按格式输出每一个节点 关于使用DOMParser 此方法目前在IE9以上和其它浏览器里都是支持的,所以这里不在写关于IE9以下不支持的情况, 具体的使用请跳转 ...

    vc DOM操作xml,从Tree到Xml,xml到Tree

    树形控件的每个节点映射到XML,双击树节点显示其值或属性值,增加、删除、修改树节点的同时修改xml中相对应节点!其中的大部分算法都采用递归,希望对你有所帮助!

    基于 C 语言的轻量级高效 XML编解码器

    将树形数据结构用于最小化DOM 模型XML 编解码器的开发。...编码时构造DOM 树结构,采用非递归深度优先法遍历树,将其串行化成XML 串。本编解码器解决了国际化语言关键问题,是 一个通用、高效的工业级XML 应用支撑模块

    无限菜单之 xml+popup 版(IE5.5+)

    var stylesheet = new ActiveXObject("Microsoft.XMLDOM"); stylesheet.async = false; stylesheet.load( "menu.xsl" ); // 鼠标经过菜单项 function ItemOver(obj) { // 隐藏已经打开的菜单项 if ...

    史上最全韩顺平传智播客PHP就业班视频,10月份全集

    10-26 4 jquery对象集合遍历的四种形式及练习题讲解 jquery的dom操作 10-27 1课程回顾 10-27 2 jquery的dom操作 内部插入 外部插入 10-27 3 jquery节点操作 10-27 4 练习题讲解 10-27 5 jquery属性操作 获取子元素和...

    史上最全传智播客PHP就业班视频课,8月份视频

    10-26 4 jquery对象集合遍历的四种形式及练习题讲解 jquery的dom操作 10-27 1课程回顾 10-27 2 jquery的dom操作 内部插入 外部插入 10-27 3 jquery节点操作 10-27 4 练习题讲解 10-27 5 jquery属性操作 获取子元素和...

    史上最全韩顺平传智播客PHP就业班视频,9月份全集

    10-26 4 jquery对象集合遍历的四种形式及练习题讲解 jquery的dom操作 10-27 1课程回顾 10-27 2 jquery的dom操作 内部插入 外部插入 10-27 3 jquery节点操作 10-27 4 练习题讲解 10-27 5 jquery属性操作 获取子元素和...

    (全)传智播客PHP就业班视频完整课程

    10-26 4 jquery对象集合遍历的四种形式及练习题讲解 jquery的dom操作 10-27 1课程回顾 10-27 2 jquery的dom操作 内部插入 外部插入 10-27 3 jquery节点操作 10-27 4 练习题讲解 10-27 5 jquery属性操作 获取子元素和...

    韩顺平PHP JS JQUERY 所有视频下载种子 货真价实

    10-26 4 jquery对象集合遍历的四种形式及练习题讲解 jquery的dom操作 10-27 1课程回顾 10-27 2 jquery的dom操作 内部插入 外部插入 10-27 3 jquery节点操作 10-27 4 练习题讲解 10-27 5 jquery属性操作 获取子元素和...

    《javaScrip开发技术大全》源代码

    第4章(\代码\第04章) • sample01.htm 字符串直接量 • sample02.htm 使用转义字符 • sample03.htm 数组直接量的使用方法 • sample04.htm 数组直接量 • sample05.htm ...

    java 面试题 总结

    28、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。 以下程序使用内部类实现线程,对j增减的时候没有考虑顺序问题。 public class ThreadTest1{ private int j; public static ...

    JavaScript详解(第2版)

     18.4.2 使用Ajax从文件中获取XML   18.4.3 Ajax和表单   18.5 Ajax和JSON   18.5.1 JSON数据结构   18.5.2 使用JSON的步骤   18.5.3 JSON综合示例   18.5.4 解决eval&#40;&#41;安全问题   ...

    JavaScript应用177例

    第4章(\cha04) 4.1.htm 求平方根 4.2.htm 求质数 4.3.htm 简单数制转换 4.4.htm 数制转换函数 4.5.htm 实现计算器 第5章(\cha05) 5.1.htm 带开关的时钟 ...

    超实用的jQuery代码段

    8.8 异步加载并解析XML文件 8.9 动态加载HTML内容到标签页中 8.10 使用AJAX刷新异步提交表单 8.11 使用AJAX刷新上传图片 8.12 使用AJAX刷新验证PHP会话是否有效 8.13 在AJAX异步调用时显示加载指示器 8.14 在AJAX...

    超级有影响力霸气的Java面试题大全文档

     动态INCLUDE用jsp:include动作实现 它总是会检查所含文件中的变化,适合用于包含动态页面,并且可以带参数。 静态INCLUDE用include伪码实现,定不会检查所含文件的变化,适用于包含静态页面...

    Java学习笔记-个人整理的

    {14.4}dom4j}{207}{section.14.4} {14.5}XPath}{210}{section.14.5} {14.6}apache.commons}{211}{section.14.6} {15}sqlite3}{213}{chapter.15} {16}Web基础}{215}{chapter.16} {16.1}...

Global site tag (gtag.js) - Google Analytics