「原创声明:保留所有权利,禁止转载」
昨天完成了基于 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 热文精选
TesterHome 为用户提供「保留所有权利,禁止转载」的选项。
除非获得原作者的单独授权,任何第三方不得转载标注了「原创声明:保留所有权利,禁止转载」的内容,否则均视为侵权。
具体请参见TesterHome 知识产权保护协议。
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
暂无回复。