如何使用python解析XML
我正在尝试使用python解析xml以创建结果摘要文件。下面是我的代码和一段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导入 文件=
和
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