#coding=utf-8
import xml.dom.minidom as xmldom
import os
'''
XML文件读取
<?xml version="1.0" encoding="utf-8"?>
<catalog>
<maxid>4</maxid>
<login username="pytest" passwd='123456'>dasdas
<caption>Python</caption>
<item id="4">
<caption>测试</caption>
</item>
</login>
<item id="2">
<caption>Zope</caption>
</item>
</catalog>
'''
xmlfilepath = os.path.abspath("test.xml")
print ("xml文件路径:", xmlfilepath)
# 得到文档对象
domobj = xmldom.parse(xmlfilepath)
print("xmldom.parse:", type(domobj))
# 得到元素对象
elementobj = domobj.documentElement
print ("domobj.documentElement:", type(elementobj))
#获得子标签
subElementObj = elementobj.getElementsByTagName("login")
print ("getElementsByTagName:", type(subElementObj))
print (len(subElementObj))
# 获得标签属性值
print (subElementObj[0].getAttribute("username"))
print (subElementObj[0].getAttribute("passwd"))
#区分相同标签名的标签
subElementObj1 = elementobj.getElementsByTagName("caption")
for i in range(len(subElementObj1)):
print ("subElementObj1[i]:", type(subElementObj1[i]))
print (subElementObj1[i].firstChild.data) #显示标签对之间的数据
实列
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import os
from xml.dom.minidom import parse
class ReadXml:
def __init__(self):
self.dom = None
def get_summary_info(
self, subElementObj, pass_str = "pass",failed_str = "failed",
modules_done_str="modules_done", modules_total_str = "modules_total"
):
pass_number = failed_number = modules_done = modules_total = 0
try:
if (len(subElementObj)):
# 获得标签属性值
pass_number = subElementObj[0].getAttribute(pass_str)
failed_number = subElementObj[0].getAttribute(failed_str)
modules_done = subElementObj[0].getAttribute(modules_done_str)
modules_total = subElementObj[0].getAttribute(modules_total_str)
except Exception as e:
print(f"解析 summary_info 失败:{str(e)}")
finally:
return pass_number, failed_number, modules_done, modules_total
def get_module_info(
self, submodulObj, name_str="name",
abi_str="abi", runtime_str = "runtime"
):
modulename = abi = runtime = 0
try:
if (len(submodulObj)):
modulename = submodulObj[0].getAttribute(name_str)
abi = submodulObj[0].getAttribute(abi_str)
runtime = submodulObj[0].getAttribute(runtime_str)
except Exception as e:
print(f"解析 module_info 失败:{str(e)}")
finally:
return modulename, abi, runtime
def get_test_details(self, TestCaseobject):
"""
读取 xml 文件各节点数据
"""
result = []
try:
for index, _ in enumerate(TestCaseobject):
TestCase_name = TestCaseobject[index].getAttribute("name")
detail_node_obj = TestCaseobject[index].getElementsByTagName("Test")
sub_result = [
{
"test_suite": TestCase_name,
"case_name" : item.getAttribute("name"),
"result" : item.getAttribute("result"),
"steps":[],
"error_msg":""
} for index, item in enumerate(detail_node_obj)
]
result.extend(sub_result)
except Exception as e:
print(f"解析 get_test_details 失败:{str(e)}")
finally:
return result
def parsexml(self, xml_path):
"""
xml_path : xml 文件路径
return 图片坐标
"""
parse_result = dict()
try:
self.dom = parse(xml_path)
Summary_obj = self.dom.getElementsByTagName("Summary")
pass_number, failed_number, modules_done, modules_total = self.get_summary_info(Summary_obj)
ModuleObj = self.dom.getElementsByTagName("Module")
modulename, abi, runtime = self.get_module_info(ModuleObj)
TestCaseobject = self.dom.getElementsByTagName("TestCase")
case_details = self.get_test_details(TestCaseobject)
parse_result = {
"pass_number": pass_number,
"failed_number": failed_number,
"modules_done": modules_done,
"modules_total": modules_total,
"module_name": modulename,
"testcase_name": modulename,
"case_details": case_details
}
except Exception as e:
print(f"解析 parsexml 失败:{str(e)}")
finally:
return parse_result
if __name__ == '__main__':
import json
current_path = "/home/ts/test"
xml_file_path = os.path.join(current_path, "test_result.xml")
ParseXml_obj = ReadXml()
result = ParseXml_obj.parsexml(xml_file_path)
result = json.dumps(result, ensure_ascii=False, indent=4)
print(result)
xml 文件
<?xml version='1.0' encoding='UTF-8' standalone='no' ?><?xml-stylesheet type="text/xsl" href="compatibility_result.xsl"?>
<Result start="1613716869564" end="1613717232684" start_display="Fri Feb 19 14:41:09 CST 2021" end_display="Fri Feb 19 14:47:12 CST 2021" suite_name="xxxx" suite_version="9.0_r8" suite_plan="cts" suite_build_number="5550264" report_version="5.0" command_line_args="cts -s 000000004b96623a --module TestTracker --skip-preconditions --abi arm64-v8a" devices="000000004b96623a" host_name="user-OptiPlex-3020" os_name="Linux" os_version="5.4.0-65-generic" os_arch="amd64" java_vendor="Private Build" java_version="1.8.0_282">
<Build build_abis_64="arm64-v8a" build_manufacturer="QUALCOMM" build_abis_32="armeabi-v7a,armeabi" build_product="msmnile_gvmq" build_brand="qti" build_board="msmnile" build_serial="000000004b96623a" build_version_security_patch="2019-01-05" build_reference_fingerprint="" build_fingerprint="xxxx" build_version_sdk="28" build_abis="xxxx,armeabi" build_device="msmnile_gvmq" build_abi="arm64-v8a" build_model="ASE for 3" build_id="PQ1A.190105.004" build_abi2="" build_version_incremental="7870" build_version_release="9" build_version_base_os="" build_type="userdebug" build_tags="test-keys" />
<Summary pass="57" failed="0" modules_done="1" modules_total="1" />
<Module name="TestTracker" abi="arm64-v8a" runtime="105236" done="true" pass="57">
<TestCase name="xxxx123">
<Test result="pass" name="TestActionFun" />
<Test result="pass" name="TestAppIdFun" />
<Test result="pass" name="TestDescribeContentsFun" />
<Test result="pass" name="TestEventFun" />
<Test result="pass" name="TestExtraFun" />
<Test result="pass" name="TestFileSize" />
<Test result="pass" name="TestFlushFun" />
<Test result="pass" name="TestGetInputFun" />
<Test result="pass" name="TestGetVersionFun" />
<Test result="pass" name="TestOutputFun" />
<Test result="pass" name="TestPageNameFun" />
<Test result="pass" name="TestSourceFun" />
<Test result="pass" name="TestToStringFun" />
<Test result="pass" name="TestTrackFun" />
<Test result="pass" name="TestValueFun" />
</TestCase>
<TestCase name="xxxx456">
<Test result="pass" name="TestActionPar" />
<Test result="pass" name="TestAppIdPar" />
<Test result="pass" name="TestEventPar" />
<Test result="pass" name="TestExtraPar" />
<Test result="pass" name="TestGetInputPar" />
<Test result="pass" name="TestInitPar" />
<Test result="pass" name="TestOutputPar" />
<Test result="pass" name="TestPageNamePar" />
<Test result="pass" name="TestSourcePar" />
<Test result="pass" name="TestTrackFail" />
<Test result="pass" name="TestTrackPar" />
<Test result="pass" name="TestValuePar" />
</TestCase>
<TestCase name="xxxx789">
<Test result="pass" name="TestActionPer" />
<Test result="pass" name="TestAppIdPer" />
<Test result="pass" name="TestDescribeContentsPer" />
<Test result="pass" name="TestEventPer" />
<Test result="pass" name="TestExtraPer" />
<Test result="pass" name="TestFlushPer" />
<Test result="pass" name="TestGetInputPer" />
<Test result="pass" name="TestGetVersionPer" />
<Test result="pass" name="TestInitPer" />
<Test result="pass" name="TestOutputPer" />
<Test result="pass" name="TestPageNamePer" />
<Test result="pass" name="TestSourcePer" />
<Test result="pass" name="TestToStringPer" />
<Test result="pass" name="TestTrackPer" />
<Test result="pass" name="TestValuePer" />
</TestCase>
<TestCase name="xxxx654">
<Test result="pass" name="TestActionStr" />
<Test result="pass" name="TestAppIdStr" />
<Test result="pass" name="TestDescribeContentsStr" />
<Test result="pass" name="TestEventStr" />
<Test result="pass" name="TestExtraStr" />
<Test result="pass" name="TestFlushStr" />
<Test result="pass" name="TestGetInputStr" />
<Test result="pass" name="TestGetVersionStr" />
<Test result="pass" name="TestInitStr" />
<Test result="pass" name="TestOutputStr" />
<Test result="pass" name="TestPageNameStr" />
<Test result="pass" name="TestSourceStr" />
<Test result="pass" name="TestToStringStr" />
<Test result="pass" name="TestTrackStr" />
<Test result="pass" name="TestValueStr" />
</TestCase>
</Module>
</Result>