docs: def _parseElements(self, elementTree, expectedTag = None):
      """Read REQUIRED_ELEMENTS and OPTIONAL_ELEMENTS and returns
      the rest of the children.  Every read child element's text
      value will be filled into an attribute of the same name,
      i.e. <description>Test</description> will lead to 'Test' being
      assigned to self.description.  Missing REQUIRED_ELEMENTS
      result in warnings."""
  
      xmlns = _uriPrefix(elementTree)
  
      if expectedTag is not None:
          assert _tag(elementTree) == expectedTag, 'expected <%s>, got <%s>' % (expectedTag, _tag(elementTree))
  
      parsed = []
  
      for tagName in self.REQUIRED_ELEMENTS + self.OPTIONAL_ELEMENTS:
          tags = elementTree.findall(xmlns + tagName)
          if tags:
              parsed.extend(tags)
              tagValue = tags[0].text
              tagValue = tagValue.strip() if tagValue else ""
              if len(tags) > 1:
                  logger.warning("More than one <%s> found within %r (using only first)" % (tagName, _tag(elementTree)))
          else:
              tagValue = None
              if tagName in self.REQUIRED_ELEMENTS:
                  logger.warning("Required element %r not found within %r" % (tagName, _tag(elementTree)))
          setattr(self, _tagToIdentifier(tagName), tagValue)
  
      return [tag for tag in elementTree if tag not in parsed]