问题
Please suggest me what add additional code need to be added for the below code so that i can parse the below XML code to get the description.
<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>
what i need to print is ECG is Enabled , NIBP is enabled etc..
the code i used is added below. I need to update the same code because of some dependency. need to add the code at print(Need to add the code here) mentioned in the code
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))
Ex
pected result
tst_Setup_menu_2 8 0 ECG Enabled
p1 Enabled
P2 Enabled etc
回答1:
Expanding on my previous answer, please do use the ElementTree API for such tasks:
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))
回答2:
The following looks for result nodes and then the descriptions contained within them. This prevents incorrect description nodes from being selected
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
Gives
Comparison
'1' and 'True' are equal
ECG is enabled
....
The getElementsByName method returns a list of nodes (hence the looping). The line result.getElementsByTagName("description") returns the node <description>Comparison</description>. The text 'Comparison' is a text node in XML, hence you have to reference it with firstChild (to get the node) and data to get the text
[EDIT]
If you require the 3rd description (and you know it will always be the third) you could do this (untested)
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
来源:https://stackoverflow.com/questions/14461128/xml-parsing-to-get-description-using-python-using-minidom