1.概述
Python有三种方法解析XML:SAX,DOM,以及ElementTree:
1.SAX (simple API for XML )
python 标准库包含SAX解析器,SAX用事件驱动模型,通过在解析XML的过程中触发一个个的事件并调用用户定义的回调函数来处理XML文件。
2.DOM(Document Object Model)
将XML数据在内存中解析成一个树,通过对树的操作来操作XML。
3.ElementTree(元素树)
ElementTree就像一个轻量级的DOM,具有方便友好的API。代码可用性好,速度快,消耗内存少。
DOM需要将XML数据映射到内存中的树,一是比较慢,二是比较耗内存; 而SAX流式读取XML文件,比较快,占用内存少,但需要用户实现回调函数(handler)
综上:
如果XML文件很大,那么建议SAX,否则可以考虑DOM(DOM代码会简单一些)
2.利用Python解析自动化测试中的Paramter Xml文件
2.1 Paramter Xml文件
在我们的自动化测试系统中,对于同一个自动化Case,需要测试不同的场景,一种场景就是一个Test Case;
所以每个自动化Case会有一个Paramter Xml文件,里面包括了一系列的场景,如果后期有新的场景需要测试,测试人员只需修改Xml文件
Xml文件如下:
case_1_param_1
case_1_param_2
case_1_param_3
case_1_param_4
case_1_param_5
case_1_param_6
case_1_param_7
case_2_param_1
case_2_param_2
case_2_param_3
case_2_param_4
case_2_param_5
case_2_param_6
case_2_param_7
2.2 利用xml.dom解析自动化测试中的Paramter Xml文件
#!/usr/bin/python#-*- coding: UTF-8 -*-
importxml.dom.minidomdefchange_xml_parameter_to_dict(parameterInXml,parameterInDic):
keyname=parameterInXml.tagNameifparameterInXml.hasChildNodes():
keyvalue=parameterInXml.childNodes[0].dataelse:
keyvalue=''parameterInDic[keyname]=keyvaluedefparse_xml_parameter_file(xml_parameter_file):#使用minidom解析器打开 XML 文档
DOMTree =xml.dom.minidom.parse(xml_parameter_file)
collection=DOMTree.documentElement#解析xml,把每个TestCase的parameters保存在一个dictionary中,并且以list的方式返回所有的dictionary
para_for_all_tcs=[]
all_tcs_in_xml= collection.getElementsByTagName("Testcase")for one_tc_in_xml inall_tcs_in_xml:
para_for_one_tc={}
para_for_one_tc['CASE_NAME']=one_tc_in_xml.getAttribute('casename')for parameter inone_tc_in_xml.childNodes:if parameter.nodeType == 1:
change_xml_parameter_to_dict(parameter,para_for_one_tc)else:continuepara_for_all_tcs.append(para_for_one_tc)returnpara_for_all_tcsif __name__=='__main__':
para_for_all_tcs= parse_xml_parameter_file(r"testData\simple_paramter_file.xml")print para_for_all_tcs
2.3 利用xml.sax解析自动化测试中的Paramter Xml文件
importxml.saxclassParameterFileHandle(xml.sax.ContentHandler):def __init__(self):
self.para_for_all_tcs=[]
self.para_for_one_tc={}
self.element_tag= ""self.element_data= ""
defstartElement(self,name,attrs):
self.element_tag=nameif self.element_tag == "TestCase":
self.para_for_one_tc['CASE_NAME']=attrs['casename']defendElement(self,name):
self.element_tag=nameif self.element_tag == "Testcase":
self.para_for_all_tcs.append(self.para_for_one_tc)
self.para_for_one_tc={}else:
self.para_for_one_tc[self.element_tag]=self.element_datadefcharacters(self,content):if self.element_tag != "Testcase":
self.element_data=contentdefparse_xml_parameter_file(xml_file):
parser=xml.sax.make_parser()
xml_handle=ParameterFileHandle()
parser.setContentHandler(xml_handle)
parser.parse(xml_file)printxml_handle.para_for_all_tcsif __name__=='__main__':
parse_xml_parameter_file(r"testData\simple_paramter_file.xml")