python通用性的生成xml文件

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_28847617/article/details/87880122

(1)准备json格式数据文件:(tablespace.json)

Json格式数据文件内容:

{
"sql":"SELECT a.tablespace_name as tablespace_name,total / (1024 * 1024 * 1024) as tablespace_total_size,free / (1024 * 1024 * 1024) as tablespace_fre
e_size,(total - free) / (1024 * 1024 * 1024) as tablespace_use_size,round((total - free) / total, 4) * 100 as rate FROM (SELECT tablespace_name,SUM(by
tes) free FROM dba_free_space GROUP BY tablespace_name) a,(SELECT tablespace_name,SUM(bytes) total FROM dba_data_files GROUP BY tablespace_name) b WHE
RE a.tablespace_name = b.tablespace_name",
"column_list":{"name":"分区名","total_size":"表空间总大小","free_size":"表空间剩余大小","use_size":"表空间使用大小","rate":"表空间利用率"}
}

(2)  执行程序入口脚本:(tablespace.sh)

脚本代码:

#!/usr/bin/sh

#########执行监控数据库表空间利用率#######
sh /app/interface/monitor/bin/main.sh "tablespace.json"

(3)下一个环节的脚本:(main.sh)

脚本代码:

#!/usr/bin/sh

json_name=$1

扫描二维码关注公众号,回复: 5436792 查看本文章

work_path=/app/interface/monitor

json_path=${work_path}/json

export json_path

bin_path=${work_path}/bin

export bin_path

sh ${bin_path}/get_cmd_data.sh ${json_name}

(4)下一个环节脚本:(get_cmd_data.sh)

#!/usr/bin/sh

json_name=$1

python3 ${bin_path}/parse_json.py --file=${json_name}

(5)、进入python脚本:(parse_json.py)

#coding=gbk

import os

import os.path

import getopt

import sys

import product_xmlfile

################################################
#                -------   解析json格式文件数据   --------                #
################################################

cmd_dict={}

options,argvs=getopt.getopt(sys.argv[1:],'help',["file="])

for opt,val in options:

        if opt == "--file":

                cmd_dict['file']=val
json_dir=os.environ['json_path']

json_file=os.path.join(json_dir,cmd_dict['file'])

print("json格式文件的绝对路径:",json_file)

import json

try:
        file=open(json_file,mode='r')

        python_data=json.load(file)

        ####print("解析到的json格式数据是:",python_data)

        print("需要执行的SQL语句:",python_data['sql'])

        print("表字段名映射关系字典:",python_data['column_list'])

        product_xmlfile.condb_oracle(python_data['sql'],python_data['column_list'])

except Exception as error:

        print("发生异常信息:",error)

finally:

        file.close()

(6)、最后一个Python脚本:(product_xmlfile.py)

#coding=gbk

import time

import cx_Oracle

import xml.dom.minidom as DOM

'''
        ##############  生成xml的文件  ################

        ########编写者:luojian  时间:20190222##########
'''

def for_cycle(data,map_relation):

        '''
        该方法主要是完成for循环
        '''
        doc=DOM.Document()

        root_node=doc.createElement("monitor")

        doc.appendChild(root_node)

        sub_node_number=0########累计子节点的序号

        for row_data in data:

                sub_node_name=doc.createElement("tablespace")

                root_node.appendChild(sub_node_name)

                make_xml_sub_node(doc,sub_node_name,row_data,map_relation)

        print(doc.toprettyxml(indent="\t",newl="\n",encoding="utf-8").decode())

        file_time=time.strftime("%Y-%m-%d-%H-%M",time.localtime())

        xml_file="monitor_tablespace_"+file_time+".xml"

        file=open(xml_file,mode='w',encoding='gb2312')#####写入xml文件中的字符串编码格式

        write_data=doc.toprettyxml(indent="\t",newl="\n",encoding="utf-8").decode()######二进制数据转换成字符串

        file.write(write_data)

        file.close()

def make_xml_sub_node(docu,node_name,row_data,map_relation):

        '''
        循环遍历返回值,来完成子节点结构的建立
        '''
        column_list=list(map_relation.keys())

        row_count=len(row_data)

        for row_no in range(row_count):

                sub_node_name=docu.createElement(column_list[row_no])

                node_name.appendChild(sub_node_name)

                make_node_text(docu,sub_node_name,row_data[row_no],map_relation[column_list[row_no]])

def make_node_text(docu,node_name,text,remark_text):

        '''
        针对创建好的元素节点进行赋值文本内容
        '''
        sub_text_node=docu.createTextNode(str(text))#########元素节点的文本内容必须强制转换成字符串

        node_name.appendChild(sub_text_node)

        node_name.setAttribute("remark",remark_text)

def condb_oracle(sql_text,map_relation):

        '''
        ######## 先链接数据库,获取返回结果集 #########
        '''
        condb_ref=cx_Oracle.connect("用户名","密码","tns标识符")

        select_cursor=condb_ref.cursor()

        select_cursor.execute(sql_text)

        data_list=select_cursor.fetchall()

        select_cursor.close()

        condb_ref.close()

        for_cycle(data_list,map_relation)

最终执行完脚本生成的效果:

monitor_tablespace_2019-02-22-15-27.xml

查看Xml文件内容:

<?xml version="1.0" encoding="utf-8"?>
<monitor>
        <tablespace>
                <name remark="分区名">DATAQUALITY_V5</name>
                <total_size remark="表空间总大小">4.8828125</total_size>
                <free_size remark="表空间剩余大小">4.8802490234375</free_size>
                <use_size remark="表空间使用大小">0.0025634765625</use_size>
                <rate remark="表空间利用率">0.05</rate>
        </tablespace>
        <tablespace>
                <name remark="分区名">GLCPERF</name>
                <total_size remark="表空间总大小">251.796875</total_size>
                <free_size remark="表空间剩余大小">230.4801025390625</free_size>
                <use_size remark="表空间使用大小">21.3167724609375</use_size>
                <rate remark="表空间利用率">8.47</rate>
        </tablespace>
        <tablespace>
                <name remark="分区名">GLCPERF_SPACE_PAR</name>
                <total_size remark="表空间总大小">117.1875</total_size>
                <free_size remark="表空间剩余大小">22.2354736328125</free_size>
                <use_size remark="表空间使用大小">94.9520263671875</use_size>
                <rate remark="表空间利用率">81.03</rate>
        </tablespace>
        <tablespace>
                <name remark="分区名">IDATA</name>
                <total_size remark="表空间总大小">0.125</total_size>
                <free_size remark="表空间剩余大小">0.1240234375</free_size>
                <use_size remark="表空间使用大小">0.0009765625</use_size>
                <rate remark="表空间利用率">0.78</rate>
        </tablespace>
        <tablespace>
                <name remark="分区名">IRMS_CQ_SCHEDULE_SPACE</name>
                <total_size remark="表空间总大小">0.125</total_size>
                <free_size remark="表空间剩余大小">0.09197998046875</free_size>
                <use_size remark="表空间使用大小">0.03302001953125</use_size>
                <rate remark="表空间利用率">26.42</rate>
        </tablespace>
        <tablespace>
                <name remark="分区名">METADB_V2</name>
                <total_size remark="表空间总大小">29.296875</total_size>
                <free_size remark="表空间剩余大小">9.87548828125</free_size>
                <use_size remark="表空间使用大小">19.42138671875</use_size>
                <rate remark="表空间利用率">66.29</rate>
        </tablespace>
        <tablespace>
                <name remark="分区名">NEWGLC_SPACE</name>
                <total_size remark="表空间总大小">901.1406097412109</total_size>
                <free_size remark="表空间剩余大小">577.6820068359375</free_size>
                <use_size remark="表空间使用大小">323.45860290527344</use_size>
                <rate remark="表空间利用率">35.89</rate>
        </tablespace>
        <tablespace>
                <name remark="分区名">NEWGLC_SPACE_PAR</name>
                <total_size remark="表空间总大小">322.265625</total_size>
                <free_size remark="表空间剩余大小">239.84332275390625</free_size>
                <use_size remark="表空间使用大小">82.42230224609375</use_size>
                <rate remark="表空间利用率">25.58</rate>
        </tablespace>
        <tablespace>
                <name remark="分区名">SYSAUX</name>
                <total_size remark="表空间总大小">8.75</total_size>
                <free_size remark="表空间剩余大小">6.58807373046875</free_size>
                <use_size remark="表空间使用大小">2.16192626953125</use_size>
                <rate remark="表空间利用率">24.71</rate>
        </tablespace>
        <tablespace>
                <name remark="分区名">SYSTEM</name>
                <total_size remark="表空间总大小">4</total_size>
                <free_size remark="表空间剩余大小">3.0810546875</free_size>
                <use_size remark="表空间使用大小">0.9189453125</use_size>
                <rate remark="表空间利用率">22.97</rate>
        </tablespace>
        <tablespace>
                <name remark="分区名">TEST20190111</name>
                <total_size remark="表空间总大小">0.1953125</total_size>
                <free_size remark="表空间剩余大小">0.1943359375</free_size>
                <use_size remark="表空间使用大小">0.0009765625</use_size>
                <rate remark="表空间利用率">0.5</rate>
        </tablespace>
        <tablespace>
                <name remark="分区名">UNDOTBS1</name>
                <total_size remark="表空间总大小">62.74607849121094</total_size>
                <free_size remark="表空间剩余大小">56.95843505859375</free_size>
                <use_size remark="表空间使用大小">5.7876434326171875</use_size>
                <rate remark="表空间利用率">9.22</rate>
        </tablespace>
        <tablespace>
                <name remark="分区名">UNDOTBS2</name>
                <total_size remark="表空间总大小">47.99998474121094</total_size>
                <free_size remark="表空间剩余大小">37.1485595703125</free_size>
                <use_size remark="表空间使用大小">10.851425170898438</use_size>
                <rate remark="表空间利用率">22.61</rate>
        </tablespace>
        <tablespace>
                <name remark="分区名">USERS</name>
                <total_size remark="表空间总大小">0.010986328125</total_size>
                <free_size remark="表空间剩余大小">0.00335693359375</free_size>
                <use_size remark="表空间使用大小">0.00762939453125</use_size>
                <rate remark="表空间利用率">69.44</rate>
        </tablespace>
        <tablespace>
                <name remark="分区名">YN_AUTHDB_TABLESPACE</name>
                <total_size remark="表空间总大小">2.9296875</total_size>
                <free_size remark="表空间剩余大小">2.86346435546875</free_size>
                <use_size remark="表空间使用大小">0.06622314453125</use_size>
                <rate remark="表空间利用率">2.26</rate>
        </tablespace>
</monitor>

猜你喜欢

转载自blog.csdn.net/qq_28847617/article/details/87880122