docs: def process(self):
          """
          populate the report from the xml
          :return:
          """
          suites = None
          if isinstance(self.tree, ET.Element):
              root = self.tree
          else:
              root = self.tree.getroot()
  
          if root.tag == "testrun":
              root = root[0]
  
          if root.tag == "testsuite":
              suites = [root]
  
          if root.tag == "testsuites":
              suites = [x for x in root]
  
          assert suites, "could not find test suites in results xml"
  
          for suite in suites:
              cursuite = Suite()
              self.suites.append(cursuite)
              cursuite.name = suite.attrib["name"]
              if "package" in suite.attrib:
                  cursuite.package = suite.attrib["package"]
              cursuite.duration = float(suite.attrib.get("time", '0').replace(',',''))
  
              for element in suite:
                  if element.tag == "error":
                      # top level error?
                      errtag = {
                          "message": element.attrib.get("message", ""),
                          "type": element.attrib.get("type", ""),
                          "text": element.text
                      }
                      cursuite.errors.append(errtag)
                  if element.tag == "system-out":
                      cursuite.stdout = element.text
                  if element.tag == "system-err":
                      cursuite.stderr = element.text
  
                  if element.tag == "properties":
                      for prop in element:
                          if prop.tag == "property":
                              cursuite.properties[prop.attrib["name"]] = prop.attrib["value"]
  
                  if element.tag == "testcase":
                      testcase = element
  
                      if not testcase.attrib.get("classname", None):
                          testcase.attrib["classname"] = NO_CLASSNAME
  
                      if testcase.attrib["classname"] not in cursuite:
                          testclass = Class()
                          testclass.name = testcase.attrib["classname"]
                          cursuite[testclass.name] = testclass
  
                      testclass = cursuite[testcase.attrib["classname"]]
                      newcase = Case()
                      newcase.name = testcase.attrib["name"]
                      newcase.testclass = testclass
                      newcase.duration = float(testcase.attrib.get("time", '0').replace(',',''))
                      testclass.cases.append(newcase)
  
                      # does this test case have any children?
                      for child in testcase:
                          if child.tag == "skipped":
                              newcase.skipped = child.text
                              if "message" in child.attrib:
                                  newcase.skipped_msg = child.attrib["message"]
                          elif child.tag == "system-out":
                              newcase.stdout = child.text
                          elif child.tag == "system-err":
                              newcase.stderr = child.text
                          elif child.tag == "failure":
                              newcase.failure = child.text
                              if "message" in child.attrib:
                                  newcase.failure_msg = child.attrib["message"]
                          elif child.tag == "error":
                              newcase.failure = child.text
                              if "message" in child.attrib:
                                  newcase.failure_msg = child.attrib["message"]
                          elif child.tag == "properties":
                              for property in child:
                                  newproperty = Property()
                                  newproperty.name = property.attrib["name"]
                                  newproperty.value = property.attrib["value"]
                                  newcase.properties.append(newproperty)