Python无法从XML的父标记获取子标记及其值

时间:2018-07-12 13:55:09

标签: python xml minidom

在Python中,我使用xml.dom import minidom 模块中的。 此外,我有一个xml,尝试使用上述模块进行解析。

<?xml version="1.0" encoding="UTF-8"?>
<testsuites tests="4" failures="2">
    <testsuite name="iOSUITests" tests="4" failures="2" time="9325.715">
        <testcase classname="DR" name="test_1()" time="26.1042">
        </testcase>
        <testcase classname="DR" name="test_2()" time="31.5843">
        </testcase>
        <testcase classname="DR" name="test_3()" time="32.8958">
            <failure message="failed - reason1">
            </failure>
        </testcase>
        <testcase classname="GD" name="test_4()" time="48.18003">
            <failure message="failed - reason2">
            </failure>
        </testcase>
    </testsuite>
</testsuites>

我试图获取每个测试用例的失败子标记,但无法为相应的测试用例获取它。因为我需要将测试用例的状态更新为“通过”或“失败”及其消息。我试图执行下面的代码。

testcase = doc.getElementsByTagName("testcase")
for index, tc in enumerate(testcase):
xml_testcase_list.append({})
xml_testcase_list[index][classname] = tc.getAttribute(classname)
#print "tc.firstChild.items()", tc.childNodes.item
#print "tc.firstChild.items()", tc.firstChild.nodeValue
if 'failure' in tc.firstChild.nodeValue:
    xml_testcase_list[index][failure] = []
    failure = doc.getElementsByTagName("failure")[0]
    #print "getNodeText(failure)", failure.childNodes
    for each_index, each_failure in enumerate(failure):
        xml_testcase_list[index][failure].append({})
        xml_testcase_list[index][failure][each_index][message] = each_failure.getAttribute(message)

如何在if条件下获取失败标签?

2 个答案:

答案 0 :(得分:1)

要获得failure元素的所有testcase子标记,可以调用tc.getElementsByTagName("failure")。如果在元素上使用该方法,它将仅检查子级。然后,您可以检查返回的数组是否为空,如果不是,则得到第一个结果。

from xml.dom import minidom

with open('xml.xml') as f:  # your file stored in xml.xml
    doc = minidom.parse(f)

testcase = doc.getElementsByTagName("testcase")
xml_testcase_list = []
for index, tc in enumerate(testcase):
    xml_testcase_list.append({})
    xml_testcase_list[index]['classname'] = tc.getAttribute('classname')
    failures = tc.getElementsByTagName('failure')
    if failures:
        xml_testcase_list[index][failure] = []
        failure = failures[0]
        for each_index, each_failure in enumerate(failure):
            xml_testcase_list[index][failure].append({})
            xml_testcase_list[index][failure][each_index][message] = each_failure.getAttribute(message)
    else:
        print 'no failures for', tc

我不得不说您的示例不包含failure的任何子元素,因此for each_index, each_failure将无法按预期工作。

答案 1 :(得分:0)

挑战不是if条件,而是您引用标签的方式:

xml_testcase_list[index][classname] = tc.getAttribute(classname)  

应该是

xml_testcase_list[index]['classname'] = tc.getAttribute('classname')  

也请发送您的错误消息。