python 解析xml文件

#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>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值