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  阅读(342)  评论(0编辑  收藏  举报

导航