Python xml格式转json格式 json格式转xml格式详解,并附打包好的可执行exe

背景

目前在做银行的消息平台的接口测试,原来的协议是TCP的发送的是xml报文,最新的采用了http协议发送的是json,这样就需要将近1千个消息模板转换成json,如果让测试人员纯人工操作不但需要耗费大量的时间,而且无法保证正确性,基于这样的背景下我决定开发一个小工具,批量转换。

环境

  1. 开发工具:Pycharm
  2. Python版本:Python3.7
  3. 依赖包:xmltodict
  4. 系统:Windows10

代码

目录结构
Python xml格式转json格式 json格式转xml格式详解,并附打包好的可执行exe_第1张图片

  1. 引入依赖文件
import os
import json
import xmltodict
from xml.dom.minidom import parseString

2.编写xmlToJson单文件操作方法

# 单文件操作
def xmlToJson(xml_path, json_path, log):
    # 读取文件
    with open(xml_path, 'r', encoding='UTF-8')as json_file:
        xml_data = json_file.read()
        json_file.close()
        log.info("%s 要转换的xml: \n" % xml_path + str(xml_data))

    # xml转换成json
    xmlparse = xmltodict.parse(xml_data, encoding='UTF-8')
    jsonstr = json.dumps(xmlparse, indent=1, ensure_ascii=False)
    log.info('转换成json后:\n' + str(jsonstr))

    # 重新写入文件
    with open(json_path, 'w', encoding='UTF-8')as xml_file:
        xml_file.write(jsonstr)
        xml_file.close()
    log.info('写入 %s 文件成功' % json_path)

3.编写xmlToJson文件夹下批量操作方法

# 文件夹操作
def xml_to_json(xml_dir, json_dir, log):
    # 创建文件夹
    if not os.path.exists(xml_dir):
        os.makedirs(xml_dir)

    if not os.path.exists(json_dir):
        os.makedirs(json_dir)

    # 把文件夹下的文件生成数组
    file_list = os.listdir(xml_dir)
    log.info('%s 文件夹下要转换的文件列表:' % xml_dir + str(file_list))
	
	# 遍历文件找到xml文件进行单文件操作
    for file in file_list:
        file_list = file.split(".")
        if file_list[-1] == 'xml':
            x_path = os.path.join(xml_dir, file)
            j_path_file_name = file_list[0] + '.json'
            j_path = os.path.join(json_dir, j_path_file_name)
            xmlToJson(x_path, j_path, log)
  1. 顺便写了jsonToXml的单文件和文件夹批量处理方法
# 单文件操作
def jsonToXml(json_path, xml_path, log):
    # 读取文件
    with open(json_path, 'r', encoding='UTF-8')as json_file:
        load_dict = json.loads(json_file.read())
        json_file.close()
        log.info("%s 要转换的json: " % json_path + str(load_dict))

    # 不指定根节点,把json转换成xml
    xml = xmltodict.unparse(load_dict, encoding='utf-8')
    # xml = dicttoxml(load_dict, root=False, attr_type=False)
    dom = parseString(xml)
    xml_context = dom.toprettyxml()
    log.info("转换成xml: \n" + str(xml_context))

    # 重新写入文件
    with open(xml_path, 'w', encoding='UTF-8')as xml_file:
        xml_file.write(str(xml_context))
        xml_file.close()
    log.info('写入 %s 文件成功' % xml_path)
# 文件夹操作
def json_to_xml(json_dir, xml_dir, log):
    # 创建文件夹
    if not os.path.exists(xml_dir):
        log.info('不存在 %s 文件夹,自动创建' % xml_dir)
        os.makedirs(xml_dir)

    if not os.path.exists(json_dir):
        log.info('不存在 %s 文件夹,自动创建' % json_dir)
        os.makedirs(json_dir)

    # 把文件夹下的json文件生成数组
    file_list = os.listdir(json_dir)
    log.info('%s 文件夹下要转换的文件列表:' % json_dir + str(file_list))

    for file in file_list:
        file_list = file.split(".")
        if file_list[-1] == 'json':
            j_path = os.path.join(json_dir, file)
            x_path_file_name = 'template_' + file_list[0] + '.xml'
            x_path = os.path.join(xml_dir, x_path_file_name)
            jsonToXml(j_path, x_path, log)
  1. 增加了一个日志模块方便排查问题
import logging
from logging import handlers

"""
    获取日志处理对象
    :param filename: 日志文件名称
    :param level: 日志等级:debug, info, warn/warning, error, critical
    :param when: 日志文件分割的时间单位,单位有以下几种:
- S 秒
- M 分
- H 小时
- D 天
- W 每星期
- midnight 每天凌晨
:param backupCount: 备份文件的个数,如果超过这个数量,就会自动删除 :param fmt: 日志信息格式 """
# 日志级别字典 __level_dict = { 'critical': logging.CRITICAL, 'fatal': logging.CRITICAL, 'error': logging.ERROR, 'warning': logging.WARNING, 'warn': logging.WARNING, 'info': logging.INFO, 'debug': logging.DEBUG } def get_log( filename, level,when='MIDNIGHT', backupCount=3, maxBytes=10000000, fmt='%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s'): level = __level_dict.get(level.lower(), None) logger = logging.getLogger(filename) # 设置日志名称 format_str = logging.Formatter(fmt) # 设置日志格式 logger.setLevel(level) # 设置日志级别 console_handler = logging.StreamHandler() # 控制台输出 console_handler.setFormatter(format_str) # 控制台输出的格式 logger.addHandler(console_handler) # 控制台输出 file_handler = handlers.RotatingFileHandler(filename=filename, maxBytes=maxBytes, backupCount=backupCount, encoding='utf-8') # 文件输出 file_handler.setFormatter(format_str) # 文件输出格式 logger.addHandler(file_handler) # 日志输出 return logger

方法调试测试

if __name__ == '__main__':
    filename = 'change.log'
    level = 'info'
    log = get_log(filename, level)

    # 单个文件 xml 转json
    x_path = r"C:\Users\Desktop\template_020103.xml"
    j_path = r"C:\Users\Desktop\111.json"
    xmlToJson(x_path,j_path,log)

    # 文件夹批量 xml转json
    x_dir = r"C:\Users\Desktop\xml"
    j_dir = r"C:\Users\Desktop\json"
    xml_to_json(x_dir, j_dir, log)

到此已经实现了xml json互转的基本功能,但是这样不方便测试人员使用,因为不是每个测试人员都有运行环境的,所以可以通过加打包的方式生成exe可执行程序,这样即可直接在windows环境下双击运行。
详细操作详见:
如何把Python 多文件项目打包成可执行的exe程序

打包好的可执行exe,可以直接下载
链接:https://pan.baidu.com/s/1SMGrdL5gIzORsBYvhFtnwg
提取码:cptt

你可能感兴趣的:(Python,json,xml,python)