【问题标题】:XML parsing to get description using python using minidomXML解析以使用python使用minidom获取描述
【发布时间】:2013-01-22 14:42:26
【问题描述】:

请建议我为以下代码添加哪些附加代码,以便我可以解析以下 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

【问题讨论】:

  • 在从 Firefox 复制 XML 之前使用“查看源代码”;浏览器会显示带有一些额外小部件的 XML,否则当您将其粘贴到此处时,这些小部件会显示为 - 符号。
  • 请尝试更多地使用 ElementTree。你从来没有向我提供足够的信息来帮助你处理your previous question,我向你展示了 ElementTree 更容易用于这些任务。
  • 依赖是什么?你真的应该考虑重构并可能切换到另一个解析库,因为你所拥有的完全不可读。
  • @Martijn Pieters:我使用的是 PythonWin 3.2.2,但找不到 lxml
  • @BrijeshKrishnan:ElementTree 是 Python 的一部分,它以 xml.etree.ElementTree 与 Python 3.2 捆绑在一起。 lxml 包使用相同的 API,但不是您的任务所必需的,我会说。

标签: python xml xml-parsing


【解决方案1】:

扩展我的previous answer,请务必使用 ElementTree API 来完成此类任务:

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))

【讨论】:

  • 最后一个标签,我在 0x42ce438 得到
  • tst_Setup_menu_2 8 0
  • @BrijeshKrishnan:哎呀,对不起,每个元素后面应该是.text
  • 虽然这可能会解决问题,但它并不能真正回答问题。在这种情况下,它真的值得接受吗?
  • @MarkRansom:对话已经进行了不止几个问题。 OP 似乎对 ElementTree 的可用性感到困惑,并且在使用 ET 运行以前的答案时遇到了麻烦。此外,我通常建议在 OP a) 感谢我的帮助并且 b) 之前尚未接受答案时接受答案。
【解决方案2】:

以下查找结果节点,然后查找其中包含的描述。这样可以防止选择不正确的描述节点

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") 行返回节点 &lt;description&gt;Comparison&lt;/description&gt;。文本“比较”是 XML 中的文本节点,因此您必须使用 firstChild(获取节点)和数据来引用它来获取文本

[编辑]

如果您需要第三个描述(并且您知道它将永远是第三个),您可以这样做(未经测试)

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

【讨论】:

  • 谢谢。这样可行。但这里有一个问题,我只需要第三个描述。是否有任何规定仅获取“ECG 已启用”?
  • 当我放 if len(my_Test_description >= 3): 它给出错误 Traceback (最近一次调用最后): TypeError: unorderable types: NodeList() >= int()
猜你喜欢
  • 1970-01-01
  • 2017-09-22
  • 2018-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-31
  • 1970-01-01
相关资源
最近更新 更多