Python解析XML文件
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文件如下:
<?xml version="1.0"?> <ParameterTree> <Testcase description="Test Case - 1 "> <PARAMS_1>case_1_param_1</PARAMS_1> <PARAMS_2>case_1_param_2</PARAMS_2> <PARAMS_3>case_1_param_3</PARAMS_3> <PARAMS_4>case_1_param_4</PARAMS_4> <PARAMS_5>case_1_param_5</PARAMS_5> <PARAMS_6>case_1_param_6</PARAMS_6> <PARAMS_7>case_1_param_7</PARAMS_7> </Testcase> <Testcase description="Test Case - 2 "> <PARAMS_1>case_2_param_1</PARAMS_1> <PARAMS_2>case_2_param_2</PARAMS_2> <PARAMS_3>case_2_param_3</PARAMS_3> <PARAMS_4>case_2_param_4</PARAMS_4> <PARAMS_5>case_2_param_5</PARAMS_5> <PARAMS_6>case_2_param_6</PARAMS_6> <PARAMS_7>case_2_param_7</PARAMS_7> </Testcase> </ParameterTree>
2.2 利用xml.dom解析自动化测试中的Paramter Xml文件
#!/usr/bin/python # -*- coding: UTF-8 -*- import xml.dom.minidom def change_xml_parameter_to_dict(parameterInXml,parameterInDic): keyname=parameterInXml.tagName if parameterInXml.hasChildNodes(): keyvalue=parameterInXml.childNodes[0].data else: keyvalue='' parameterInDic[keyname]=keyvalue def parse_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 in all_tcs_in_xml: para_for_one_tc={} para_for_one_tc['CASE_NAME']=one_tc_in_xml.getAttribute('casename') for parameter in one_tc_in_xml.childNodes: if parameter.nodeType == 1: change_xml_parameter_to_dict(parameter,para_for_one_tc) else: continue para_for_all_tcs.append(para_for_one_tc) return para_for_all_tcs if __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文件
import xml.sax class ParameterFileHandle(xml.sax.ContentHandler): def __init__(self): self.para_for_all_tcs=[] self.para_for_one_tc={} self.element_tag = "" self.element_data = "" def startElement(self,name,attrs): self.element_tag = name if self.element_tag == "TestCase": self.para_for_one_tc['CASE_NAME']=attrs['casename'] def endElement(self,name): self.element_tag = name if 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_data def characters(self,content): if self.element_tag != "Testcase": self.element_data = content def parse_xml_parameter_file(xml_file): parser = xml.sax.make_parser() xml_handle = ParameterFileHandle() parser.setContentHandler(xml_handle) parser.parse(xml_file) print xml_handle.para_for_all_tcs if __name__=='__main__': parse_xml_parameter_file(r"testData\simple_paramter_file.xml")
posted on 2018-09-06 17:21 cherryjing0629 阅读(349) 评论(0) 编辑 收藏 举报