XML parsing to get description using python using minidom

不问归期 提交于 2019-12-12 03:04:15

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!