扫码阅读
手机扫码阅读
基于DOM4J的XML文件解析类
48 2024-04-17
XML
文件解析分四类方式:DOM解析;SAX解析;JDOM解析;DOM4J解析。其中前两种属于基础方法,是官方提供的平台无关的解析方式;后两种属于扩展方法,它们是在基础的方法上扩展出来的,只适用于java平台。目前已经完成一种方式的封装
基于DOM的XML文件解析类。
语言我依然采用了Groovy
模式,有兴趣的同学可以去看看:
从Java到Groovy的八级进化论。还有更多高级特性实践可以在公众号里面搜Groovy
即可,包括在JMeter
中支持Java
(即Groovy
)脚本。
xml
文件内容(已删节);
<root path="/xdfapp"> <zknode name="DCSS" value="38d9ab9f3e7bfab1127cea3e42fb1237f9e73bdb"> <zknode name="v1.0$"> <zknode name="unchange"> <zknode name="datadb.database" value="Export from zookeeper configuration group: [/xdfapp/DCSS] - [v1.0] - [unchange]."/> <zknode name="redis.host"/> <zknode name="db.host.w"/> <zknode name="datadb.password" value="127.0.0.1"/> <zknode name="datadb.host.r"/> <zknode name="db.host.r"/> <zknode name="datadb.host.w"/> zknode> zknode> <zknode name="v1.0" value="10.10.1.3"> <zknode name="unchange" value="10.10.1.3"> <zknode name="db.database" value="******"/> <zknode name="db.password" value="***"/> <zknode name="dbdata.password" value="***"/> <zknode name="dbdata.database" value="****"/> <zknode name="redis.port" value="**"/> <zknode name="datadb.username" value="****"/> <zknode name="db.host.r" value="******"/> <zknode name="dbdata.port" value="***"/> <zknode name="datadb.database" value="********"/> <zknode name="datadb.password" value="dsjw2015"/> <zknode name="db.port" value="3306"/> <zknode name="pgc.resources.url" value="http://*******"/> zknode> <zknode name="change" value="10.10.1.3"/> zknode> zknode> <zknode name="ailearn-work-svr" value="******"> <zknode name="v1.0$"> <zknode name="unchange"> <zknode name="v3.db" value="Export from zookeeper configuration group: [/xdfapp/ailearn-work-svr] - [v1.0] - [unchange]."/> <zknode name="work.host"/> <zknode name="v3.host"/> zknode> zknode> <zknode name="v1.0" value="*******"> <zknode name="unchange" value="*****"> <zknode name="v3.port" value="****"/> <zknode name="work.passwd" value="*****"/> <zknode name="work.port" value="3306"/> <zknode name="v3.host" value="*********"/> <zknode name="work.user" value="*********"/> <zknode name="v3.db" value="******"/> <zknode name="v3.user" value="******"/> <zknode name="work.db" value="**********"/> zknode> zknode> zknode> root>
工具类:
package com.fun.utils.xml import com.fun.base.exception.FailException import com.fun.frame.SourceCode import org.dom4j.* import org.dom4j.io.SAXReader import org.slf4j.Logger import org.slf4j.LoggerFactory /**
* 基于dom4j解析xml工具类
*/ class XMLUtil2 extends SourceCode { private static Logger logger = LoggerFactory.getLogger(XMLUtil2.class) static List parse(String path) {
SAXReader reader = new SAXReader(); try {
Document document = reader.read(path.startsWith("http") ? new URL(path) : new File(path));
Element rootElement = document.getRootElement(); def iterator = rootElement.elementIterator()
List info = new ArrayList<>() while (iterator.hasNext()) {
info << parseNode(iterator.next() as Element)
} return info;
} catch (DocumentException e) {
logger.error("解析文件${path}失败!", e)
}
FailException.fail("解析文件${path}失败!")
} static NodeInfo parseNode(Element e) { if (e.getNodeType() != Node.ELEMENT_NODE) return null; def info = new NodeInfo()
List attributes = e.attributes();
List attrs = new ArrayList<>()
attributes.each {
attrs << new Attr(it.name, it.value)
}
info.setAttrs(attrs)
List children = new ArrayList<>() def iterator = e.elementIterator() if (iterator.hasNext()) {
children << parseNode(iterator.next() as Element)
}
info.setChildren(children) return info;
}
}
后续会进行优化和改进,最新代码请移步我的git地址:https://github.com/JunManYuanLong/FunTester,点击阅读原文也可以。
控制台输出:
内容较多,分成了头尾两张。
头部图片 尾部图片
原文链接:
https://mp.weixin.qq.com/s?__biz=MzU4MTE2NDEyMQ==&mid=2247488089&idx=1&sn=9d3fc8ff80e0ba2d49dc56e60f568c95
FunTester的其他文章
加入社区微信群
与行业大咖零距离交流学习
软件研发质量管理体系建设
白皮书上线