XML 檔案解析實踐 (DOM 解析)
昨天完成了基於DOM的XML檔案解析類,今天趕緊實踐了一下,不得不說,實踐中的坑還是很多的。
本來這個專案就是為了規範各個服務在使用MySQL
資料庫時候的配置項,由於之前我接觸的都是Java
服務,對於這些服務也算比較瞭解,大家的配置項基本還算是保持一致
,今天解析所有服務的配置項,大開眼界。
- 不看不知道,世界真奇妙。
首先是配置項的層級結構,一般來講,一個root
作為根節點,然後子節點都是各個服務節點,在服務節點下面是服務版本節點,然後是change
和unchange
兩個節點,然後是具體的內容。奈何人算不如天算,算來算去不如狗帶。
先看圖:
居然所有節點都是zknode
,這是其一,在每個版本下面還有不同的配置模組,然後子節點配置具體資訊。
居然還有沒有value
的配置項,我真實要狗帶了。
然後就是MySQL
配置,簡直重新整理世界觀。
下面是我從XML
總的配置檔案擷取的內容:
<zknode name="datadb.username" value="****"/>
<zknode name="db.host.r" value="****"/>
<zknode name="dbdata.host.w" value="*"/>
<zknode name="datadb.port" value="*"/>
<zknode name="datadb.databasev3" value="*****"/>
<zknode name="datadb.host.w" value="*****"/>
<zknode name="v3.db" value="******"/>
<zknode name="v3.user" value="******"/>
<zknode name="work.db" value="******"/>
<zknode name="work.host" value="******"/>
<zknode name="v3.passwd" value="******"/>
<zknode name="DB_CONNECTION" value="******"/>
<zknode name="DB_HOST" value="******"/>
<zknode name="DB_DATABASE" value="******"/>
<zknode name="DB_PASSWORD" value="******"/>
<zknode name="mysql.DB_DATABASE" value="***"/>
<zknode name="redis.REDIS_PORT" value="***"/>
<zknode name="ds.druid.username" value="****"/>
<zknode name="ds.druid.url" value="****"/>
此處省略100種資料庫配置
痛定思痛,該吐槽已經吐槽完了,活兒還是得幹完的。經過不斷嘗試,終於完成了一種解決的指令碼。
我覺得需要一個寬屏顯示器了。
package com.fun.ztest.groovy
import com.fun.frame.httpclient.FanLibrary
import com.fun.utils.XMLUtil
import org.slf4j.Logger
import org.slf4j.LoggerFactory
class Td extends FanLibrary {
private static Logger logger = LoggerFactory.getLogger(Td.class)
public static void main(String[] args) {
def xml = XMLUtil.parseXml("/Users/fv/Downloads/d.xml", "root")
xml.get(0).getChildren().each {
logger.error("服務名:{}", it.getAttrs().get(0).getValue())
def children = it.getChildren()
children.each {
def attr1 = it.getAttrs()
def name = attr1.get(0).getValue()
if (name ==~ /[vV]\d.\d+/) {
logger.error("zk版本:${name}")
def children1 = it.getChildren()
children1.each {
def children2 = it.getChildren()
children2.each {
def attrs = it.getAttrs()
if (attrs.size() > 1) {
def var = attrs.get(0).getValue()
def value = attrs.get(1).getValue()
if (!(value ==~ /\d+/)) {
if (var.contains("druid") || var.contains("db") || var.contains("user") || value.contains("mysql") || value.contains("neworiental") || value.contains("neworiental")) {
if (!value.contains("{") && !value.contains(".txt") && !var.contains("service") && !var.contains("maill") && !var.contains("host") && !var.contains("driver") && !var.contains("filters") && !var.contains("center") && !var.contains("rabbit") && !var.contains("order") && !value.contains("http"))
logger.info("key: {},value: {}", var, value)
}
}
}
}
}
}
}
}
testOver()
}
}
公眾號FunTester首發,原創分享愛好者,騰訊雲和掘金社群首頁推薦,知乎七級原創作者,歡迎關注、交流,禁止第三方擅自轉載。
FunTester熱文精選
相關文章
- python 解析xml 檔案: DOM 方式PythonXML
- 基於 DOM 的 XML 檔案解析類XML
- 使用PHP DOM-XML建立和解析XML檔案 (轉)PHPXML
- DOM解析XMLXML
- Java DOM4J 方式解析XML檔案JavaXML
- xml解析之domXML
- Python解析xml[xml.dom]PythonXML
- jdom解析xml檔案XML
- GData解析XML檔案XML
- jquery 解析xml檔案jQueryXML
- 用dom4j SAXReader解析xml檔案及字串XML字串
- Python XML解析之DOMPythonXML
- XML DOM 解析器概述XML
- dom4j解析xmlXML
- Java中Dom解析xml文件JavaXML
- 使用 Java 解析XML檔案JavaXML
- 利用Perl解析XML檔案XML
- C#解析XML檔案C#XML
- python XML 檔案解析PythonXML
- 讀取xml檔案 解析雙層xmlXML
- Android之XML檔案解析AndroidXML
- XML DOM 解析器錯誤概述XML
- 使用dom4j 解析, 操作XMLXML
- Dom4j解析XML資料XML
- 使用Dom4j解析XML案例XML
- Android系列--DOM、SAX、Pull解析XMLAndroidXML
- Python解析XML檔案生成HTMLPythonXMLHTML
- Java XML檔案解析書目錄JavaXML
- python 解析xml 檔案: SAX方式PythonXML
- Python解析xml大檔案(sax)PythonXML
- AndroidManifest.xml檔案解析AndroidXML
- mybatis原始碼配置檔案解析之五:解析mappers標籤(解析XML對映檔案)MyBatis原始碼APPXML
- jquery實現的解析xml檔案程式碼例項jQueryXML
- android下解析.plist配置檔案的xml解析器AndroidXML
- XML解析的兩種方式DOM和SAXXML
- 如何使用 ABAP 程式碼解析 XML 檔案XML
- c#(解析xml檔案基礎方法)C#XML
- jQuery解析xml檔案程式碼例項jQueryXML