扫码阅读
手机扫码阅读
基于DOM的XML文件解析类
44 2024-04-17
最近公司做服务配置检查,特别是zookeeper
配置里面关于数据库、redis、域名的配置。刚好还没弄过XML
解析,所以顺手封装了一个工具类。
XML
文件解析分四类方式:「DOM解析」;「SAX解析」;「JDOM解析」;「DOM4J解析」。其中前两种属于基础方法,是官方提供的平台无关的解析方式;后两种属于扩展方法,它们是在基础的方法上扩展出来的,只适用于java平台。
权衡之后我先选择了「DOM解析」,因为文件不大(1万行),只是一次性的脚本,不存在性能方面的考虑。
语言我依然采用了Groovy
模式,不能不说太好用了,之前讲过如何在两个小时内容从Java
过渡到Groovy
,有兴趣的同学可以去看看:从Java到Groovy的八级进化论。还有更多高级特性实践可以在公众号里面搜Groovy
即可,包括在JMeter
中支持Java
(即Groovy
)脚本。
xml
文件内容(已删节);
<root path="/xdfapp"> <zknode name="DCSS" value="38d9ab9f3e7b424324cea3e42fb1237f9e73bdb"> <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> root>
下面分享Demo:
package com.fun.ztest.groovy import com.fun.base.bean.AbstractBean import com.fun.base.exception.FailException import com.fun.frame.SourceCode import org.slf4j.Logger import org.slf4j.LoggerFactory import org.w3c.dom.Document import org.w3c.dom.NamedNodeMap import org.w3c.dom.Node import org.w3c.dom.NodeList import org.xml.sax.SAXException import javax.xml.parsers.DocumentBuilder import javax.xml.parsers.DocumentBuilderFactory import javax.xml.parsers.ParserConfigurationException class XMLUtil extends SourceCode { private static Logger logger = LoggerFactory.getLogger(XMLUtil.class) public static void main(String[] args) { def xml = parseXml("/Users/fv/Downloads/dev.xml", "root")
output(xml)
} public static List parseXml(String path, String root) {
NodeList nodes = parseRoot(path, root) return range(nodes.getLength()).mapToObj {x -> parseNode(nodes.item(x))}.collect() as List
} public static NodeList parseRoot(String path, String root) {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance() try {
DocumentBuilder db = dbf.newDocumentBuilder()
Document document = db.parse(new File(path))
NodeList bookList = document.getElementsByTagName(root) return bookList
} catch (ParserConfigurationException e) {
logger.error("解析配置错误!", e)
} catch (IOException e) {
logger.error("IO错误!", e)
} catch (SAXException e) {
logger.error("SAX错误!", e)
}
FailException.fail("解析文件:${path}中${root}节点出错!")
} public static NodeInfo parseNode(Node node) { if (node.getNodeType() != node.ELEMENT_NODE) return null NodeInfo nodeInfo = new NodeInfo()
NamedNodeMap attrs = node.getAttributes()
List nodeAttr = new ArrayList<>()
range(attrs.getLength()).each {
Node attr = attrs.item(it)
String nodeName = attr.getNodeName()
String nodeValue = attr.getNodeValue()
Attr e = new Attr(nodeName, nodeValue)
nodeAttr.add(e)
}
nodeInfo.arrts = nodeAttr short nodeType = node.getNodeType() if (nodeType != Node.ELEMENT_NODE) return nodeInfo
NodeList childNodes = node.getChildNodes()
List children = new ArrayList<>()
childNodes.getLength()
range(childNodes.getLength()).each {children.add(parseNode(childNodes.item(it)))}
nodeInfo.children = children.findAll {it != null} return nodeInfo
} static class NodeInfo extends AbstractBean { private static final long serialVersionUID = 568896512159847L
List arrts
List children
} static class Attr extends AbstractBean { private static final long serialVersionUID = -35484487563215649L
String name
String value public Attr(String name, String value) { this.name = name this.value = value
}
}
}
控制台输出:
内容较多,分成了头尾两张。
尾部图片
原文链接:
https://mp.weixin.qq.com/s?__biz=MzU4MTE2NDEyMQ==&mid=2247488020&idx=1&sn=6f0e897360642ebbf950e22ec1dff46a
没有了
上一篇
XML文件解析实践(DOM解析)
下一篇
FunTester的其他文章
跨浏览器测试策略
我们生活在一个每天创建超过 50 万个网站的时代。截
Redis API——Set功能实践与性能测试【Go版】
之前说要写个 Go 语言版本的 Redis 操作 API 和性能测试
Selenium 中并行测试的重要性
随着技术的进步,测试解决方案变得更具可扩展性,加速了团队从手动测试到Selenium测试自动化的转型。
应对自动化测试9大挑战
本文讨论了最常遇到的关键挑战,以及如何帮助简单地或自动地应对这些挑战。
连续测试策略
尽管这些公司花费大量时间和金钱来改变他们的开发流程(敏捷开发),但是仅仅通过选择一些自动化工具,写一些自动化项目,根本无法实现「PPT」上描述的的「没好愿景」。
加入社区微信群
与行业大咖零距离交流学习
软件研发质量管理体系建设
白皮书上线