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/