XML 檔案解析實踐 (DOM 解析)

FunTester發表於2020-10-02

昨天完成了基於DOM的XML檔案解析類,今天趕緊實踐了一下,不得不說,實踐中的坑還是很多的。

本來這個專案就是為了規範各個服務在使用MySQL資料庫時候的配置項,由於之前我接觸的都是Java服務,對於這些服務也算比較瞭解,大家的配置項基本還算是保持一致,今天解析所有服務的配置項,大開眼界。

  • 不看不知道,世界真奇妙。

首先是配置項的層級結構,一般來講,一個root作為根節點,然後子節點都是各個服務節點,在服務節點下面是服務版本節點,然後是changeunchange兩個節點,然後是具體的內容。奈何人算不如天算,算來算去不如狗帶。

先看圖:

zk配置截圖

居然所有節點都是zknode,這是其一,在每個版本下面還有不同的配置模組,然後子節點配置具體資訊。

zk配置截圖

居然還有沒有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熱文精選

相關文章