在做接口自動化的時候,請求數據之前都是JSON格式的,Python有自帶的包來解決。最近在做APP的接口,遇到XML格式的請求數據,費了很大勁來解決,解決方式是:接口文檔拿到的是XML,在線轉化為json格式(目的是拿到xml數據的模板),存放到json文件中,根據接口名去提取。
- github原文介紹:使用XML的Python模塊感覺就像您在使用JSON
- 鏈接:https://github.com/martinblech/xmltodict
下載xmltodict(pip install xmltodict)
C:\Users\wy.DESKTOP-KENPKKP\Desktop\Dingda\dingAPI>pip install xmltodict
Requirement already satisfied: xmltodict in c:\users\wy.desktop-kenpkkp\appdata\local\programs\python\python36\lib\site-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