遞迴遍歷xml檔案所有節點
阿新 • • 發佈:2018-11-04
由於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()