docs: def fromxml(node):
          """Create a Parameter instance (of any class derived from AbstractParameter!) given its XML description. Node can be a string containing XML or an lxml _Element"""
          if not isinstance(node,ElementTree._Element): #pylint: disable=protected-access
              node = ElementTree.parse(StringIO(node)).getroot()
          if node.tag in globals():
              id = ''
              paramflag = ''
              name = ''
              description = ''
              kwargs = {}
              error = None
              for attrib, value in node.attrib.items():
                  if attrib == 'id':
                      id = value
                  elif attrib == 'paramflag':
                      paramflag = value
                  elif attrib == 'name':
                      name = value
                  elif attrib == 'description':
                      description = value
                  elif attrib == 'error':
                      error = value
                  else:
                      kwargs[attrib] = value
  
              #extra parsing for choice parameter (TODO: put in a better spot)
              if 'multi' in kwargs and (kwargs['multi'] == 'yes' or kwargs['multi'] == '1' or kwargs['multi'] == 'true'):
                  kwargs['value'] = []
  
              for subtag in node: #parse possible subtags
                  if subtag.tag == 'choice': #extra parsing for choice parameter (TODO: put in a better spot)
                      if 'choices' not in kwargs: kwargs['choices'] = {}
                      kwargs['choices'][subtag.attrib['id']] = subtag.text
                      if 'selected' in subtag.attrib and (subtag.attrib['selected'] == '1' or subtag.attrib['selected'] == 'yes'):
                          if 'multi' in kwargs and (kwargs['multi'] == 'yes' or kwargs['multi'] == '1' or kwargs['multi'] == 'true'):
                              kwargs['value'].append(subtag.attrib['id'])
                          else:
                              kwargs['value'] = subtag.attrib['id']
  
              parameter = globals()[node.tag](id, name, description, **kwargs) #return parameter instance
              if error:
                  parameter.error = error #prevent error from getting reset
              return parameter
          else:
              raise Exception("No such parameter exists: " + node.tag)