基於 DOM 的 XML 檔案解析類
最近公司做服務配置檢查,特別是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熱文精選
相關文章
- XML 檔案解析實踐 (DOM 解析)XML
- MyBatis基於xml檔案的 CURD案例MyBatisXML
- c#(解析xml檔案基礎方法)C#XML
- python XML 檔案解析PythonXML
- jdom解析xml檔案XML
- Python XML解析之DOMPythonXML
- 使用 Java 解析XML檔案JavaXML
- XML DOM 解析器概述XML
- 使用JAXP對xml文件進行DOM解析基礎XML
- Python解析XML檔案生成HTMLPythonXMLHTML
- XML DOM 解析器錯誤概述XML
- java的XML解析(DOM4J技術)JavaXML
- springMVC---配置檔案解析(web.xml)SpringMVCWebXML
- 如何使用 ABAP 程式碼解析 XML 檔案XML
- mybatis的全域性配置檔案SqlMapConfig.xml解析MyBatisSQLXML
- mybatis原始碼配置檔案解析之五:解析mappers標籤(解析XML對映檔案)MyBatis原始碼APPXML
- xml檔案XML
- 【mybatis xml】資料層框架應用--Mybatis 基於XML對映檔案實現資料的CRUDMyBatisXML框架
- 基於XML的DIXML
- ie中jQuery無法解析xml檔案的解決方案jQueryXML
- 深入解析Class類檔案的結構
- 【JVM】深入解析class類檔案JVM
- DOM4J 解析 XML 之忽略轉義字元XML字元
- xml是什麼格式的檔案 xml檔案怎麼開啟XML
- 解析XML檔案時,無效的XML 字元 (Unicode: 0x7)異常處理XML字元Unicode
- 死磕Spring之IoC篇 - BeanDefinition 的解析階段(XML 檔案)SpringBeanXML
- mach-o 檔案分析(解析類)Mac
- DEX檔案解析--7、類及其類資料解析(完結篇)
- 基於virtual dom 的canvas渲染Canvas
- AndroidMainfest.xml檔案AndroidAIXML
- C# XML基礎入門(XML檔案內容增刪改查清)C#XML
- Spring基於XML方式的使用SpringXML
- java 語音用xml檔案實現圖形介面 xml檔案JavaXML
- XML DOM(Document Object Model)XMLObject
- SSM整合之使用配置類替換xml配置檔案(2)SSMXML
- 可用於解析 Excel 檔案的程式語言Excel
- 【SSM框架整合】專案xml檔案、properties等檔案的配置SSM框架XML
- Maven的settings.xml檔案配置MavenXML