dom4j是适用于Java的灵活XML框架,是用来读写XML文件的。首先要做的第一件事儿就是分析某种类型的xml文档,定义如下:
SAXReader reader = new SAXReader(); Document document = reader.read(url);
如果您必须遍历大型 XML 文档树,那么为了提高性能,我们建议您使用快速循环方法,该方法可避免为每个循环创建对象的成本,文档示例:
public void treeWalk(Document document) { treeWalk(document.getRootElement()); } public void treeWalk(Element element) { for (int i = 0, size = element.nodeCount(); i < size; i++) { Node node = element.node(i); if (node instanceof Element) { treeWalk((Element) node); } else { // do something… } } }
我在项目中的应用:
private static void getChildNodes(Element element) { Iterator<Node> item = element.nodeIterator(); while (item.hasNext()) { Node node = item.next(); if (node instanceof Element) { Element el = (Element) node; int count = el.attributeCount(); if (count!=0) { String nameValue = el.attributeValue("name"); System.out.println(nameValue); } getChildNodes(el); } } }
以下是我在项目中用的完整例子:
代码文件:
package com.zxt.code3.codeexample.base; import org.apache.commons.lang3.StringUtils; import org.dom4j.*; import org.dom4j.io.SAXReader; import java.io.File; import java.net.MalformedURLException; import java.util.Iterator; import java.util.List; /** * @author zty * @description * @date 2022/3/12 */ public class Exmple { public static void main(String[] args) throws DocumentException, MalformedURLException { SAXReader saxReader = new SAXReader(); Document document = saxReader.read(new File("D://rv4d_menus_new.xml")); /** * 节点对象的操作方法 */ //获取文档根节点 Element root = document.getRootElement(); List<Element> list = root.elements(); //遍历list取值 for (Element element : list) { //使用递归函数 getChildNodes(element); } } /** * 递归查询节点函数,输出节点名称 * * @param element */ private static void getChildNodes(Element element) { Iterator<Node> item = element.nodeIterator(); while (item.hasNext()) { Node node = item.next(); if (node instanceof Element) { Element el = (Element) node; int count = el.attributeCount(); if (count!=0) { String nameValue = el.attributeValue("name"); System.out.println(nameValue); } getChildNodes(el); } } } }
对应的xml文件(rv4d_menus_new.xml)
<?xml version="1.0" encoding="UTF-8"?>
<Menus>
<Module name = "1011">
<Menu name = "光缆网">
<item name="光缆割接分析" reportId="gjfx.gqfx.tj"/>
<item name="光业务信息查询">
<url>
<![CDATA[
../content/page/fibersupport/fiberinfo.jsp
]]>
</url>
</item>
<item name="光缆坏端口统计" reportId="glhdktj"/>
<!-- <item name="设备接入号统计" reportId="sbjrhtj"></item> -->
<item name="光缆坏端口统计(成电专用)" reportId="glhdktj.cd"/>
<item name="中继光缆数据质量检查" reportId="zjgl.zjglsjzljc"/>
<item name="运营局中继光缆数据质量检查" reportId="zjgl.yyjzjglsjzljc"/>
<item name="本地光缆设备量统计汇总表" reportId="bd.glsbl.hzb"/>
<item name="本地光缆设备量统计汇总表(城市R分表)" reportId="bd.glsbl.csfb"/>
<item name="本地光缆设备量统计汇总表(农村分表)" reportId="bd.glsbl.ncfb"/>
<item name="未归属到运营分局光缆设备量统计表" reportId="bd.glsbl.hzb.sz"/>
<item name="光缆分级统计" reportId="local.zqczgl.hzb.par"/>
<item name="一分以上光缆资源二维码标签完成率" reportId="yfysglzyeym" />
<item name="管线资源属性完好率统计" reportId="res.remote.check.data"/>
</Menu>
</Module>
<Module name = "1012">
<Menu name = "传输网">
<item name="传输电路查询">
<url>
<![CDATA[
../Router/gotoQuery.action?dtoType=rmp.rv4.dataview.biz.service.route.TransDTO&serviceName=rmp.rv4.dataview.biz.service.route.RouteService&queryMethod=findTransWithPage
]]>
</url>
</item>
<item name="传输设备割接分析" reportId="gjfx.csfx.tj"/>
<item name="传输电路历史查询">
<url>
<![CDATA[
../Router/gotoQuery.action?dtoType=rmp.rv4.dataview.biz.service.route.TransHisDTO&serviceName=rmp.rv4.dataview.biz.service.route.RouteService&queryMethod=findTransHisWithPage
]]>
</url>
</item>
<item name="局端MSAP端口信息查询" reportId="pztj.msapdkcx"/>
<item name="传输电路资源详情" reportId="pztj.csdlzyxq"/>
</Menu>
</Module>
</Menus>
注意:github下载:http://dom4j.github.io/
