• Python中xml和dict格式转换


    在做接口自动化的时候,请求数据之前都是JSON格式的,Python有自带的包来解决。最近在做APP的接口,遇到XML格式的请求数据,费了很大劲来解决,解决方式是:接口文档拿到的是XML,在线转化为json格式(目的是拿到xml数据的模板),存放到json文件中,根据接口名去提取。

    下载xmltodict(pip install xmltodict)

    C:Userswy.DESKTOP-KENPKKPDesktopDingdadingAPI>pip  install xmltodict
    Requirement already satisfied: xmltodict in c:userswy.desktop-kenpkkpappdatalocalprogramspythonpython36libsite-packages
     (0.12.0)
    
    

    直接演示了,准备一个原始的XML的数据

    <?xml version="1.0"?>
    <mydocument has="an attribute">#has是节点属性
        <and>
            <many>elements</many>
            <many>more elements</many>
        </and>
        <plus a="complex">
            element as well
        </plus>
    </mydocument>
    

    由于目前没有找到能够将XML直接赋值给函数的方法,所以先用在线转化工具将XML转化为JSON,转化后的结果为

    {
      "mydocument": {
        "-has": "an attribute",    #在这里要留意一个事情,XML是有节点的,节点有属性,json数据的键之前有-的,就是属性,但是xmltodict识别的属性是@,所以要把-替换为@(就是这里找了好久)
        "and": {
          "many": [
            "elements",
            "more elements"
          ]
        },
        "plus": {
          "-a": "complex",
          "#text": "
            element as well
        "
        }
      }
    }
    

    示例代码

    dictdata={
        "mydocument": {
            "@has": "an attribute",
            "and": {
                "many": [
                    "elements",
                    "more elements"
                ]
            },
            "plus": {
                "@a": "complex",
                "#text": "element as well"
    }
    }
    }
    xmldata=xmltodict.unparse(dictdata,pretty=True)#dict转xml
    print(xmldata)#解析结果可以复制运行查看,结果是原始数据
    new_dictdata=xmltodict.parse(xmldata,process_namespaces = True)#xml转dict
    print(new_dictdata)#在这里有一个注意事项,new_dictdata的数据格式是<class 'collections.OrderedDict'>,并不直接是dict,需要自行处理
    """
    处理方式如下
    """
    key_dictdata=dict(new_dictdata)
    value_dictdata=dict(dict(new_dictdata)["mydocument"])
    key_dictdata["mydocument"]=value_dictdata
    print(key_dictdata)
    
    

    上面就是xml和dict转化,如果需要转化json,内置的json模块就可以完成,但是在自动化测试框架中这样使用比较麻烦,而且复用性不好,封装好如下

    #-*- coding: utf-8 -*
    #@author 小测试 
    #@create 2019-10-30 15:46
    import xmltodict
    """
    xml和dict转换
    """
    def dict_xml(dictdata):
        """
        dict转xml
        dictstr: dict字符串
        return: xml字符串
        """
        xmlstr=xmltodict.unparse(dictdata, pretty=True)
        return xmlstr
    def xml_dict(xmldata,moudle):
        """
        xml转dict
        xmlstr: xml字符串
        moudle:根节点
        return: dict字符串
        """
        data=xmltodict.parse(xmldata,process_namespaces = True)
        dictdata=dict(data)
        _dictdata=dict(dictdata[moudle])
        dictdata[moudle]=_dictdata
        return dictdata
    
  • 相关阅读:
    关于Python虚拟环境与包管理你应该知道的事
    你是否真的了解全局解析锁(GIL)
    谈谈装饰器的实现原理
    快速了解Python并发编程的工程实现(下)
    快速了解Python并发编程的工程实现(上)
    简单了解一下事件循环(Event Loop)
    为何你还不懂得如何使用Python协程
    一文搞懂Python可迭代、迭代器和生成器的概念
    源码分析Retrofit请求流程
    一份程序猿单词列表(updating)
  • 原文地址:https://www.cnblogs.com/Testking/p/11809532.html
Copyright © 2020-2023  润新知