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/