| 23 | return reparsed.toprettyxml(indent=" ") |
| 24 | |
| 25 | class ast2xml(ast.NodeVisitor): |
| 26 | def __init__(self): |
| 27 | super(ast.NodeVisitor, self).__init__() |
| 28 | self.path = [] |
| 29 | self.root = etree.Element('ast') |
| 30 | self.celement = self.root |
| 31 | def convert(self, tree): |
| 32 | self.visit(tree) |
| 33 | return etree.tostring(self.root) |
| 34 | def generic_visit(self, node): |
| 35 | node_name = type(node).__name__ |
| 36 | self.path.append(node_name) |
| 37 | ocelement = self.celement |
| 38 | self.celement = etree.SubElement(self.celement, node_name) |
| 39 | for item in node.__dict__: |
| 40 | if isinstance(getattr(node, item), ast.AST): |
| 41 | self.generic_visit(getattr(node, item)) |
| 42 | elif isinstance(getattr(node, item), list): |
| 43 | ocel2 = self.celement |
| 44 | self.celement = etree.SubElement(self.celement, item) |
| 45 | [self.generic_visit(childnode) for childnode in getattr(node, item) if isinstance(childnode, (ast.AST, list))] |
| 46 | self.celement = ocel2 |
| 47 | else: |
| 48 | self.celement.attrib.update({item: str(getattr(node, item))}) |
| 49 | self.path.pop() |
| 50 | self.celement = ocelement |
| 51 | |
| 52 | def main(fpath): |
| 53 | with open(fpath, 'r') as f: |