Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用python解析XML_Python_Xml_Parsing_Xml Parsing - Fatal编程技术网

如何使用python解析XML

如何使用python解析XML,python,xml,parsing,xml-parsing,Python,Xml,Parsing,Xml Parsing,我正在尝试使用python解析xml以创建结果摘要文件。下面是我的代码和一段xml,与下面一样,我有两个部分,分别是和 VP5:对象属性“”的比较:\u QMenu\u 3.启用的“”传递的“”为false“”与“”为false“”相等 :_QMenu_3 启用 假的 我想得到的是, 在一个部分中有多少通过/失败 下面的代码将在xml文件中打印通过/失败的总数。但我感兴趣的是每个部分有多少通过/失败。有男孩能告诉我取这个的程序吗 导入系统 将xml.dom.minidom作为XY导入 文件=

我正在尝试使用python解析xml以创建结果摘要文件。下面是我的代码和一段xml,与下面一样,我有两个部分,分别是


VP5:对象属性“”的比较:\u QMenu\u 3.启用的“”传递的“”为false“”与“”为false“”相等
:_QMenu_3
启用
假的
我想得到的是, 在一个
部分中有多少通过/失败

下面的代码将在xml文件中打印通过/失败的总数。但我感兴趣的是每个部分有多少通过/失败。有男孩能告诉我取这个的程序吗

导入系统 将xml.dom.minidom作为XY导入 文件=打开(“result.txt”、“w”) tree=XY.parse('D:\\Squish\\Squish results\\results-On-2013-01-18_0241 PM.xml') Test\u name=tree.getElementsByTagName('Test') Test_status=tree.getElementsByTagName('result') count\u testname=0 passcount=0 故障计数=0 测试\u名称\u数组=[] 对于“测试名称”中的“我的测试名称”: count\u testname=count\u testname+1 passcount=0 故障计数=0 my_Test\u name\u final=my_Test\u name.getAttribute('name')) Test\u name\u array=my\u Test\u name\u final 如果(计数\测试名称>1): 打印(我的测试名称最终版) 对于处于测试状态的“我的测试”状态: my_Test_status_final=my_Test_status.getAttribute('type')) 如果(my_Test_status_final==“通过”): passcount=passcount+1 如果(my_Test_status_final=='FAIL'): 故障计数=故障计数+1 打印(str(我的测试状态最终版))
我不会将minidom用于此任务;domapi非常繁琐、冗长,不适合搜索和匹配

Python库还包括,我将使用它:

from xml.etree import ElementTree as ET

tree = ET.parse(r'D:\Squish\squish results\Results-On-2013-01-18_0241 PM.xml')
tests = dict()

# Find all <test> elements with a <verification> child:
for test in tree.findall('.//test[verification]'):
    passed = len(test.findall(".//result[@type='PASS']"))
    failed = len(test.findall(".//result[@type='FAIL']"))
    tests[test.attrib['name']] = {'pass': passed, 'fail': failed}

谢谢你的发帖。我用minidon做的。 仍然希望看到如何使用xml.etree.ElementTree解决这个问题

import sys
import xml.dom.minidom as XY

file = open("Result_Summary.txt", "w")
#tree = XY.parse('D:\\Squish\\squish results\\Results-On-2013-01-18_0241 PM.xml')
#print (str(sys.argv[1]))
tree = XY.parse(sys.argv[1])

Test_name = tree.getElementsByTagName('test')
count_testname =0

file.write('Test Name \t\t\t No:PASS\t\t\t No:FAIL\t \n\n')
for my_Test_name in Test_name:
    count_testname = count_testname+1
    my_Test_name_final = my_Test_name.getAttribute('name')
    if(count_testname > 1):
        #print(my_Test_name_final)
        file.write(my_Test_name_final)
        file.write('\t\t\t\t')
        my_Test_status = my_Test_name.getElementsByTagName('result')
        passcount = 0
        failcount = 0
        for my_Test_status_1 in my_Test_status:
            my_Test_status_final = my_Test_status_1.getAttribute('type')
            if(my_Test_status_final == 'PASS'):
               passcount = passcount+1
            if(my_Test_status_final == 'FAIL'):
               failcount = failcount+1
            #print(str(my_Test_status_final))
        file.write(str(passcount))
        #print(passcount)
        file.write('\t\t\t\t')
        file.write(str(failcount))
       # print(failcount)
        file.write('\n')

#print ('loop count: %d' %count_testname)
#print('PASS count: %s' %passcount)
#print('FAIL count: %s' %failcount)
file.close()

虽然不是一个标准的模块,但值得努力安装,特别是如果您想进行快速Xml解析等

如果没有一个完整的结果示例,我猜它们会是什么样子

from lxml import etree

tree = etree.parse("results.xml")

count_result_type = etree.XPath("count(.//result[@type = $name])")

for test in tree.xpath("//test"):
    print test.attrib['name']
    print "\t# FAILS ", count_result_type(test, name="FAIL")
    print "\t# PASSES", count_result_type(test, name="PASS")
我根据我对xml的猜测生成了以下内容,这应该会让您了解正在发生的事情

tst_case1
    # FAILS  1.0
    # PASSES 1.0
tst_case0
    # FAILS  0.0
    # PASSES 1.0
tst_case2
    # FAILS  0.0
    # PASSES 1.0
tst_case3
    # FAILS  0.0
    # PASSES 1.0

我喜欢的是它的表现力,YMMV。

我看到你在使用Squish。您应该检查\examples\regressiontesting下的挤压文件夹。在那里可以找到一个名为xml2result2html.py的文件。在这里,您可以找到一个将挤压测试结果转换为html的示例。

您必须使用minidom吗
xml.etree
将是一个更简单、更具python风格的选择。@BrijeshKrishnan:如果
元素位于另一个元素中,那么答案应该有效;我已经测试过了(做了一个小的修正)。错误1。KeyError://结果[@type='PASS']”2。SyntaxError(“不能在元素上使用绝对路径”)这是什么python版本?注意XPath表达式开头的
;它以
//result
开头,而不是
//result
tst_case1
    # FAILS  1.0
    # PASSES 1.0
tst_case0
    # FAILS  0.0
    # PASSES 1.0
tst_case2
    # FAILS  0.0
    # PASSES 1.0
tst_case3
    # FAILS  0.0
    # PASSES 1.0