「原創宣告:保留所有權利,禁止轉載」
最近公司做服務配置檢查,特別是zookeeper
配置裡面關於資料庫、redis、域名的配置。剛好還沒弄過XML
解析,所以順手封裝了一個工具類。
XML
檔案解析分四類方式:DOM 解析;SAX 解析;JDOM 解析;DOM4J 解析。其中前兩種屬於基礎方法,是官方提供的平臺無關的解析方式;後兩種屬於擴充套件方法,它們是在基礎的方法上擴充套件出來的,只適用於 java 平臺。
權衡之後我先選擇了DOM 解析,因為檔案不大(1 萬行),只是一次性的指令碼,不存在效能方面的考慮。
語言我依然採用了Groovy
模式,不能不說太好用了,之前講過如何在兩個小時內容從Java
過渡到Groovy
,有興趣的同學可以去看看:從 Java 到 Groovy 的八級進化論。還有更多高階特性實踐可以在公眾號裡面搜Groovy
即可,包括在JMeter
中支援Java
(即Groovy
)指令碼。
xml
檔案內容(已刪節);
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<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<NodeInfo> 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<Attr> 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<NodeInfo> 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<Attr> arrts
List<NodeInfo> 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
}
}
}
控制檯輸出:
內容較多,分成了頭尾兩張。
- 做了一些最佳化和改進,最近程式碼大家移步我的 git 地址:https://github.com/JunManYuanLong/FunTester
公眾號FunTester首發,原創分享愛好者,騰訊雲和掘金社群首頁推薦,知乎七級原創作者,歡迎關注、交流,禁止第三方擅自轉載。
FunTester 熱文精選
- 寫給所有人的程式設計思維
- 2020 年 Tester 自我提升
- 未來的神器 fiddler Everywhere
- 測試開發工程師工作技巧
- Selenium4 IDE,它終於來了
- 自動化測試靈魂三問:是什麼、為什麼和做什麼
- 為什麼測試覆蓋率如此重要
- 吐個槽,非測誤入。
- 自動化測試框架
- 敏捷中的端到端測試
如果覺得我的文章對您有用,請隨意打賞。您的支援將鼓勵我繼續創作!
打賞支援
暫無回覆。