网上有很多Dom4j 解析xml的java代码,但是都忒简单了啊!
关键是大多都是知道xml嵌套了几层的情况下,但是大多数时候都没有那么简单啊!
先贴一个简单的方法,附上解析用的简单xml

<?xml version="1.0" encoding="UTF-8"?>
<bookstore><book id="1"><name>冰与火之歌</name><author>乔治马丁</author><year>2014</year><price>89</price></book><book id="2"><name>安徒生童话</name><year>2004</year><price>77</price><language>English</language></book>
</bookstore>XML

以下是dom4j的迭代器Iterator 方法解析

public class DOM4JTest {private static ArrayList<Book> bookList = new ArrayList<Book>();/*** @param args*/public static void main(String[] args) {// 解析books.xml文件// 创建SAXReader的对象readerSAXReader reader = new SAXReader();try {// 通过reader对象的read方法加载books.xml文件,获取docuemnt对象。Document document = reader.read(new File("src/res/books.xml"));// 通过document对象获取根节点bookstoreElement bookStore = document.getRootElement();// 通过element对象的elementIterator方法获取迭代器Iterator it = bookStore.elementIterator();// 遍历迭代器,获取根节点中的信息(书籍)while (it.hasNext()) {System.out.println("=====开始遍历某一本书=====");Element book = (Element) it.next();// 获取book的属性名以及 属性值List<Attribute> bookAttrs = book.attributes();for (Attribute attr : bookAttrs) {System.out.println("属性名:" + attr.getName() + "--属性值:"+ attr.getValue());}Iterator itt = book.elementIterator();while (itt.hasNext()) {Element bookChild = (Element) itt.next();System.out.println("节点名:" + bookChild.getName() + "--节点值:" + bookChild.getStringValue());}System.out.println("=====结束遍历某一本书=====");}} catch (DocumentException e) {// TODO Auto-generated catch blocke.printStackTrace();}}
}

上面方法清晰又有效,运行结果是

但是如果我把xml稍微改一下

<?xml version="1.0" encoding="UTF-8"?>
<bookstore><book id="1"><name>冰与火之歌</name><author>乔治马丁</author><year>2014</year><price><YMB>89</YMB><DOL>14</DOL></price></book><book id="2"><name>安徒生童话</name><year>2004</year><price>77</price><language>English</language></book>
</bookstore>

运行结果就会变成

那肯定不行啊。。。
所以 写了一个 循环迭代递归的 不论是否有叶子节点的 也不管你这xml有多少层的 解析
里面用到了dom4j的一个方法
public boolean hasMixedContent()
判断是否包含混合内容。即不仅包括叶子节点也就是文本内容,也包括不是文本的子节点即嵌套节点。

package demo;import java.io.File;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;public class dom4j {public static void main(String[] args) {// 创建SAXReader的对象readerSAXReader reader = new SAXReader();try {// 通过reader对象的read方法获取xml文件,docuemnt对象。Document document = reader.read(new File("src/demo/books.xml"));// 通过document对象获取根节点Element root = document.getRootElement();// 循环解析readEle(root);} catch (DocumentException e) {// TODO Auto-generated catch blocke.printStackTrace();}}public static void readEle(Element e){//判断是否有复合内容if(e.hasMixedContent()){//输出该节点的名字,对他的子节点继续进行判断System.out.println("节点名:" + e.getName());Iterator it = e.elementIterator();while (it.hasNext()) {Element arrrName = (Element) it.next();//递归readEle(arrrName);}}else{//如果没有复合内容,就可以输出了System.out.println("节点名:" + e.getName() + ",节点值:" + e.getTextTrim());}}
}

以下是运行结果

可能在输出上稍微欠佳,可以再优化一下
但是至少做到了不论xml是什么格式,嵌套了多少层,都能获取到 节点名和节点值了

java、Dom4j、循环迭代递归解析XML,不论是否是叶子节点、有复合结构相关推荐

  1. 解析XML时,需要校验节点是否闭合,如必须有与之对应,用()数据结构实现比较好?

    解析XML时,需要校验节点是否闭合,如必须有与之对应,用()数据结构实现比较好? 答案:栈 (1)栈的常见应用:浏览器历史纪录,Android中的最近任务,Activity的启动模式,CPU中栈的实现 ...

  2. JAVA SE学习day14:解析XML

    XML解析有两种方式:SAX,DOM SAX:simple api for xml,解析XML的简单API,特点是内存占用少,速度快,但由于是逐行扫描式解析,对整体结构没有把控,不能修改XML内容 * ...

  3. java jdom格式_Java全面解析XML格式串(JDOM解析)

    搜索热词 Java全面解析XML格式串(JDOM解析) import java.io.IOException; import java.io.StringReader; import java.uti ...

  4. dom4j解析xml获取所有的子节点并放入map中

    dom4j递归解析所有子节点 //解析返回的xml字符串,生成document对象 Document document = DocumentHelper.parseText(resultXml); / ...

  5. 【Java】基础知识-JAXP解析XML(一)

    1 XML概述 1.1 XML简介 [ 定义 ] XML 指可扩展标记语言(eXtensibleMarkupLanguage).可扩展标记语言(英语:Extensible Markup Languag ...

  6. Java常用算法——迭代 递归篇

    迭代 & 递归 迭代 (1).定义 来自维基百科: 迭代是重复反馈过程的活动,其目的通常是为了接近并到达所需的目标或结果.每一次对过程的重复被称为一次"迭代",而每一次迭代 ...

  7. JAVA SE 进阶篇 C3 解析XML文件,做一个jar工具包

    文章目录 P1 XML文件 1 XML文件概述 (1) 可扩展标记语言:XML (2) XML文件的书写规则和语法要求 2 创建一个XML文件 P2 解析给定的XML文件 1 XML解析器和W3C 2 ...

  8. java使用org.w3c.dom解析XML文档,创建、增删查改,保存,读取,遍历元素等操作

    全栈工程师开发手册 (作者:栾鹏) java教程全解 java使用org.w3c.dom(java dom)解析XML文档,创建.增删查改,保存,读取,遍历元素等操作 在保存文件时需要载入crimso ...

  9. 安卓小菜鸟重拾Java系列002.Java转义字符与与sax解析xml

    已经好久没有更新博客了,炎热的夏天正如我的心情一样枯燥乏味,今年是互联的寒冬,作为一个菜鸟已经深深的感觉到了,因为自己失业了.从去年的年末的一些听闻,自己竟没有准备好迎接失业,以至于一年了,只比以前强 ...

  10. SAX解析xml (遍历DOM树各节点)

    本文参考 http://yangjunfeng.iteye.com/blog/401377 1. books.xml 1 <?xml version="1.0" encodi ...

最新文章

  1. MyEclipse使用总结——设置MyEclipse使用的Tomcat服务器
  2. canvas 在线画图
  3. 通过jQuery把数据库里面的数据进行增删查改
  4. 8-3 redis sentine
  5. TypeScript -脚本编程语言
  6. 你们一直吐槽的12306,你知道他们的的架构有多牛X吗
  7. 树莓派Zero的千兆测速
  8. 人机交互(HCI)界面设计(笔记)
  9. ​UI自动化测试面试题及答案大全
  10. 自己动手写 Docker 系列文章总览
  11. 深度学习第二次培训(BP神经网络)
  12. mysql修改变量立即生效_mysql变量修改及生效
  13. MOS 转载 ORA-1555 诊断和分析
  14. mac 百度输入法如何切换成五笔,如何切换回拼音模式
  15. [RoarCTF2019]polyre
  16. 【C语言小游戏】猜数字游戏
  17. linux客户端显示fin_wait2,解决Linux服务器 FIN_WAIT2 连接过多的问题
  18. eclipse导入外部项目,package报错,显示红叉叉
  19. c# spire.xls 设置文字为微软雅黑_只要一分钟,给你的PPT文字加上拼音和声调
  20. 如何快速识别坏鸡蛋?

热门文章

  1. 包误差率(PER)与BER相关
  2. 一些网址备忘 (在线剪辑音频、在线工具箱、全网音乐下载)
  3. 如何让你的技术团队成员自觉工作
  4. ImageView实现圆形头像效果
  5. 【日语】日文假名输入与键盘对应
  6. html页面批量打印EMS快递单,如何批量打印快递单/电子面单?
  7. 基于ARM处理器的TSC2046触摸屏控制器的应用
  8. 计算机的方差符号怎么输入,【2人回答】标准差的符号在电脑上怎么输入?-3D溜溜网...
  9. acwing每日一题-战舰
  10. INS 图片/视频保存