使用Python和minidom解析XML以获取描述
请告诉我需要在下面的代码中添加什么额外的代码,以便我可以解析下面的XML代码,获取描述信息。
<SquishReport version="2.1">
<test name="HMI_testing">
<prolog time="2013-01-22T18:59:43+05:30"/>
<test name="tst_Setup_menu_2">
<prolog time="2013-01-22T18:59:43+05:30"/>
<verification line="7" type="" file="D:/Squish/HMI_testing/tst_Setup_menu_2/test.py" name="ECG is enabled">
<result type="PASS" time="2013-01-22T18:59:45+05:30">
<description>Comparison</description>
<description type="DETAILED">'1' and 'True' are equal</description>
<description type="DETAILED">ECG is enabled</description>
</result>
</verification>
<verification line="9" type="" file="D:/Squish/HMI_testing/tst_Setup_menu_2/test.py" name="ECG is enabled">
<result type="PASS" time="2013-01-22T18:59:45+05:30">
<description>Comparison</description>
<description type="DETAILED">'1' and 'True' are equal</description>
<description type="DETAILED">ECG is enabled</description>
</result>
</verification>
<verification line="11" type="" file="D:/Squish/HMI_testing/tst_Setup_menu_2/test.py" name="P1 is disabled">
<result type="PASS" time="2013-01-22T18:59:45+05:30">
<description>Comparison</description>
<description type="DETAILED">'0' and 'False' are equal</description>
<description type="DETAILED">P1 is disabled</description>
</result>
</verification>
<verification line="13" type="" file="D:/Squish/HMI_testing/tst_Setup_menu_2/test.py" name="P2 is disabled">
<result type="PASS" time="2013-01-22T18:59:45+05:30">
<description>Comparison</description>
<description type="DETAILED">'0' and 'False' are equal</description>
<description type="DETAILED">P2 is disabled</description>
</result>
</verification>
<verification line="15" type="" file="D:/Squish/HMI_testing/tst_Setup_menu_2/test.py" name="SPO2 is enabled">
<result type="PASS" time="2013-01-22T18:59:45+05:30">
<description>Comparison</description>
<description type="DETAILED">'1' and 'True' are equal</description>
<description type="DETAILED">SPO2 is enabled</description>
</result>
</verification>
<verification line="17" type="" file="D:/Squish/HMI_testing/tst_Setup_menu_2/test.py" name="CO2 is disabled">
<result type="PASS" time="2013-01-22T18:59:45+05:30">
<description>Comparison</description>
<description type="DETAILED">'0' and 'False' are equal</description>
<description type="DETAILED">CO2 is disabled</description>
</result>
</verification>
<verification line="19" type="" file="D:/Squish/HMI_testing/tst_Setup_menu_2/test.py" name="RESP is disabled">
<result type="PASS" time="2013-01-22T18:59:45+05:30">
<description>Comparison</description>
<description type="DETAILED">'0' and 'False' are equal</description>
<description type="DETAILED">RESP is disabled</description>
</result>
</verification>
<verification line="21" type="" file="D:/Squish/HMI_testing/tst_Setup_menu_2/test.py" name="TEMP is disabled">
<result type="PASS" time="2013-01-22T18:59:45+05:30">
<description>Comparison</description>
<description type="DETAILED">'0' and 'False' are equal</description>
<description type="DETAILED">TEMP is disabled</description>
</result>
</verification>
<epilog time="2013-01-22T18:59:45+05:30"/>
</test>
<epilog time="2013-01-22T18:59:45+05:30"/>
</test>
</SquishReport>
我想打印的内容是“ECG已启用”,“NIBP已启用”等等。
我使用的代码如下。由于某些依赖关系,我需要更新这段代码。需要在代码中提到的print(需要在这里添加代码)的位置添加代码。
import sys
import xml.dom.minidom as XY
file = open("Result_Summary.txt", "w")
tree = XY.parse('Results-On-2013-01-22_0659.xml')
#print (str(sys.argv[1]))
#tree = XY.parse(sys.argv[1])
Test_name = tree.getElementsByTagName('test')
count_testname =0
file.write(' -----------------------------------------------------------------------------------------------------\n\n')
file.write('\tTest Name \t\t No Of PASS\t\t No Of FAIL\t\t\t Description\t\t \n')
file.write(' -----------------------------------------------------------------------------------------------------\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')
my_Test_status = my_Test_name.getElementsByTagName('result')
passcount = 0
failcount = 0
for my_Test_status_1 in my_Test_status:
my_Test_description = my_Test_name.getElementsByTagName('description')
for my_Test_description_1 in my_Test_description:
my_Test_description_final = my_Test_description_1.getAttribute('type')
print(Need to add the code here)
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')
file.write(str(failcount))
示例
pected result
tst_Setup_menu_2 8 0 ECG Enabled
p1 Enabled
P2 Enabled etc
2 个回答
0
下面的内容是用来查找结果节点,然后获取其中的描述。这可以避免选到错误的描述节点。
import xml.dom.minidom
# str = your_string_from_the_question
doc = xml.dom.minidom.parseString(str)
for result in doc.getElementsByTagName("result"):
for description in result.getElementsByTagName("description"):
print description.firstChild.data
结果是
Comparison
'1' and 'True' are equal
ECG is enabled
....
getElementsByName 方法会返回一个节点列表(所以需要用循环来处理)。这一行 result.getElementsByTagName("description")
会返回节点 <description>Comparison</description>
。这里的 'Comparison' 是 XML 中的一个文本节点,因此你需要用 firstChild 来获取这个节点,然后用 data 来获取文本内容。
[编辑]
如果你需要第三个描述(并且你知道它总是第三个),你可以这样做(未测试)
doc = xml.dom.minidom.parseString(str)
for result in doc.getElementsByTagName("result"):
description_list = result.getElementsByTagName("description")
if len(description_list.length >= 3):
description[2].firstChild.data
1
在我之前的回答基础上,建议你使用ElementTree这个工具来处理这类任务:
from xml.etree import ElementTree as ET
tree = ET.parse(r'D:\Squish\squish results\Results-On-2013-01-18_0241 PM.xml')
with open("Result_Summary.txt", "w") as output:
output.write(' {} \n\n'.format('-' * 101))
output.write('\tTest Name \t\t No Of PASS\t\t No Of FAIL\t\t\t Description\t\t \n')
output.write(' {} \n\n'.format('-' * 101))
# Find all <test> elements with a <verification> child:
for test in tree.findall('.//test[verification]'):
# Collect passed and failed counts
passed = len(test.findall(".//result[@type='PASS']"))
failed = len(test.findall(".//result[@type='FAIL']"))
# Collect all the *last* <description> elements of type DETAILED
descriptions = test.findall(".//result/description[@type='DETAILED'][last()]")
# write a line of information to the file, including first desc
output.write('{0}\t\t\t{1}\t\t\t{2}\t\t\t{3}\n'.format(
test.attrib['name'], passed, failed, descriptions[0].text))
# write remaining descriptions
for desc in descriptions[1:]:
output.write('\t\t\t\t\t\t\t\t\t{0}\n'.format(desc.text))