由于xml格式并不是固定的,xml文件示例仅作示范,xml节点的深度变化,有点像N叉树结构,需要采用递归算法:
<?xml version="1.0" encoding="UTF-8"?>
<TestPackage
appNameSpace="com.sprd.androidtest.test"
appPackageName="AndroidP_telephony"
name="AndroidP_telephony-androidTest"
runner="android.support.test.runner.AndroidJUnitRunner"
targetBinaryName="AndroidP_telephony"
targetNameSpace="com.sprd.androidtest"
testType="instrumentation" version="1.0">
<TestSuite name="com">
<TestSuite name="sprd">
<TestSuite name="test">
<TestSuite name="uia2">
<TestSuite name="androidP">
<TestSuite name="function">
<TestSuite name="Full">
<TestSuite name="AndroidP1">
<TestCase name="AndroidP2">
<Test name="Androidptest" />
</TestCase>
</TestSuite>
<TestSuite name="fail">
<TestCase name="AddAttachByTakePictureTest">
<Test name="test_AddAttachByTakePicture" />
</TestCase>
<TestCase name="AddReceiverSearchPBTest">
<Test name="test_AddReceiverSearchPB" />
</TestCase>
</TestSuite>
</TestSuite>
</TestSuite>
</TestSuite>
</TestSuite>
</TestSuite>
</TestSuite>
</TestSuite>
</TestPackage>
代码如下:
class TraverseCaseXml(object):
def __init__(self):
self.result = list()
def get_all_cases_name(self, filepath):
tree = ET.ElementTree(file=filepath)
for elem in tree.getroot():
self.deep_traverse(elem)
return self.result
def deep_traverse(self, elem, stack=''):
sub_elems = elem.getchildren()
sub_size = len(sub_elems)
if sub_size == 0:
stack += '#' + elem.attrib.get('name')
self.result.append(stack)
stack += '.' if stack != '' else ''
stack += elem.attrib.get('name')
if sub_size == 1:
self.deep_traverse(sub_elems[0], stack)
elif sub_size > 1:
_stack = copy.copy(stack)
for sub_elem in sub_elems:
self.deep_traverse(sub_elem, _stack)
def clear(self):
self.result = []
def __del__(self):
self.clear()