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

Python unable to get child tag and its value from parent tag in XML

在 Python 中,我正在使用 from 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 条件中获取失败标记?

要获取 testcase 元素的所有 failure child 标签,如果存在,可以调用 tc.getElementsByTagName("failure")。如果你在一个元素上使用那个方法,它只会检查 children。然后你可以检查返回的数组是否为空,如果不是,则获取第一个结果。

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 的任何 child 个元素,因此 for each_index, each_failure 将无法按预期工作。

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

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

应该是

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

另请发送您的错误信息。