`

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会不会有什么不妥哦

相关推荐

    Qt实现xml文件内容的遍历读出

    总结来说,这个项目演示了如何利用Qt的QDomDocument类处理XML文件,通过递归函数遍历XML树,并使用虚函数实现多态性,为不同类型的XML节点提供灵活的处理策略。这不仅教会我们XML解析的基本技术,还展示了面向对象...

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

    总结起来,DOM4J是处理XML的优秀工具,尤其适合解析具有任意深度的XML结构。通过`SAXReader`解析XML文件,`Document`和`Element`对象提供了一种直观的方式来访问和操作XML数据。结合递归遍历,我们可以轻松地处理...

    遍历XML文件内所有节点和属性

    针对这一问题,"遍历XML文件内所有节点和属性"的非递归方法应运而生。 在描述中提到的“比递归调用的速度要快很多”,这通常是指通过迭代而非递归的方式遍历XML文档。递归方法会为每个节点创建新的函数调用栈,而当...

    Dom4j遍历解析XML

    ### Dom4j遍历解析XML知识点详解 ...通过以上步骤,我们可以看到如何使用Dom4j库来解析和遍历XML文档,提取其中的数据,并进行相应的处理。这种方式非常适合于需要对XML数据进行复杂递归处理的情况。

    qt xml操作 遍历

    在遍历XML时,我们可以利用QXmlStreamReader的readNext()方法逐个访问XML元素、属性、文本等节点。 1. **XML的读取与遍历** - 初始化QXmlStreamReader:首先,你需要创建一个QXmlStreamReader对象,并传入XML数据...

    dom4j自动解释xml文件

    DOM4J是一个强大的Java库,专门用于处理XML...通过理解XML的结构和DOM4J的API,开发者可以高效地读取、解析和操作XML数据,实现各种复杂的业务逻辑。在实际项目中,DOM4J的灵活性和性能使其成为处理XML的首选工具之一。

    dom4j解析 递归

    总结,DOM4J递归解析是处理复杂XML文档的有效手段,它允许我们逐层访问XML结构,并进行相应的操作。结合Eclipse的快捷键使用,可以进一步提高我们的编程效率。在实际项目中,理解并掌握这一技术,将使XML处理变得...

    通过Dom4j创建和读取xml文件下载

    在Java编程中,DOM4J是一个非常流行的XML处理库,它提供了一套强大的API来创建、解析和操作XML文档。...通过运行`Dom4jTest.java`,我们可以确保DOM4J的实现与预期一致,从而在实际项目中安全地使用DOM4J处理XML文件。

    Xml的递归遍历

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

    使用递归和dom遍历dom树形结构

    以下是一个使用递归和DOM来遍历XML文档的Java代码示例: ```java package com.dowebber.xmlreader; import java.io.File; import java.io.IOException; import javax.xml.parsers.DocumentBuilder; import javax....

    dom4j将xml文件导入到数据库所需要的包

    在Java开发中,DOM4J被广泛用于XML数据的读取和写入,尤其在需要将XML文件与数据库交互时,它的功能尤为突出。下面我们将深入探讨DOM4J的核心概念以及如何使用它来实现XML文件导入数据库的过程。 首先,DOM4J支持...

    dom4j操作xml文件

    在本文中,我们将深入探讨如何利用DOM4J进行XML文件的读取、写入和修改操作。 一、XML基础 XML(Extensible Markup Language)是一种标记语言,用于存储和传输结构化数据。它具有自解释性,使得数据在不同的系统间...

    java递归读取xml文件

    当我们需要读取的XML文件结构复杂,包含嵌套的元素时,递归方法就显得尤为适用。本篇文章将深入探讨如何使用Java递归地读取XML文件。 首先,我们需要了解XML的基本结构。XML(eXtensible Markup Language)是一种...

    使用dom4j将xml字符串转换成Bean对象

    // 遍历XML元素,设置Bean的属性 for (Object child : root.elements()) { Element element = (Element) child; String fieldName = element.getName(); String fieldValue = element.getTextTrim(); try { ...

    dom4j解析xml嵌套格式

    **DOM4J解析XML嵌套格式** XML(Extensible Markup Language)是一种用于标记数据的语言,广泛应用于数据交换、配置文件和文档结构定义等...通过熟练掌握DOM4J,可以高效地处理各种复杂的XML嵌套格式,提高开发效率。

    dom4j读写xml

    - 可以使用迭代器或递归遍历XML的元素结构,例如:`for (Element e : parent.getChildren()) {...}`。 7. **XPath查询** - DOM4J支持XPath表达式,可以方便地查找XML文档中的节点:`List&lt;Element&gt; elements = ...

    dom4j实战(一)——使用dom4j从XML中读取数据源配置

    这篇名为"dom4j实战(一)——使用dom4j从XML中读取数据源配置"的博客文章将深入探讨如何利用DOM4J从XML文件中读取数据源配置。 首先,我们需要理解DOM4J的基本概念。DOM4J是基于DOM模型的,DOM(Document Object ...

    dom4j面向对象解析xml

    总结,DOM4J提供了一种面向对象的方式来解析和操作XML,其强大的功能包括解析XML文件、访问元素和属性、遍历结构、使用XPath查询以及通过递归处理复杂的XML结构。熟练掌握DOM4J,能够极大地提高处理XML文档的效率和...

    dom4j解析xml

    在实际项目中,你可以根据需求灵活运用DOM4J的各种方法来解析和构建XML文档。例如,如果你需要修改一个已存在的XML文件,可以先使用DOM4J解析文件,找到需要修改的元素,然后进行相应的操作,最后再将修改后的...

Global site tag (gtag.js) - Google Analytics