class ModuleXMLParser: """ ModuleXMLParser will parse a list of modules and returns it. """ def __init__(self): self.module_list = [] self.param_list = [] self.current_module = None self.current_param = None self.cdata = "" self.parent = None self.in_description = False self.in_command = False self.in_value = False self.in_id = False self.in_child = False self.in_dependency = False def start_element(self, name, attrs): """ Function called when the start of an XML element is found """ if name == "module": self.current_module = Module(attrs['name']) self.current_module.add_id(attrs['id']) elif name == "dependency": self.in_dependency = True elif name == "param": self.current_param = Parameter() elif name == "description": self.in_description = True elif name == "value": self.in_value = True elif name == "command": self.in_command = True elif name == "id": self.in_id = True elif name == "child": self.in_child = True self.parent = self.current_module def end_element(self, name): """ Function called when the end of an XML element is found """ if name == "description": self.in_description = False if self.current_param: # Parser is inside a parameter, add the description to it self.current_param.add_description(self.cdata) else: self.current_module.add_description(self.cdata) self.cdata = "" elif name == "dependency": self.current_module.dependencies.append(int(self.cdata)) self.in_dependency = False self.cdata = "" elif name == "value": self.in_value = False self.current_param.add_value(self.cdata) self.cdata = "" elif name == "command": self.in_command = False self.current_module.add_command(self.cdata) self.cdata = "" elif name == "id": self.in_id = False self.current_param.add_id(self.cdata) self.cdata = "" elif name == "param": self.param_list.append(self.current_param) self.current_param = None elif name == "module": self.module_list.append(self.current_module) elif name == "child": # TODO: Allow having more than one child self.parent.children = self.current_module self.current_module = self.parent self.in_child = False def char_data(self, data): """ Function called when some character data within an XML element is found """ data = data.strip() if data: if self.in_description or self.in_id or self.in_command or self.in_value or self.in_dependency: self.cdata = self.cdata + data def parse(self, text): """ Sets up expat with the correct custom parser functions and parses text """ parser = expat.ParserCreate() parser.StartElementHandler = self.start_element parser.EndElementHandler = self.end_element parser.CharacterDataHandler = self.char_data parser.Parse(text, 1) return (self.module_list, self.param_list)