code: def parse_soap_enveloped_saml(text, body_class, header_class=None):
      
      envelope = defusedxml.ElementTree.fromstring(text)
      assert envelope.tag == '{%s}Envelope' % NAMESPACE
  
      # print(len(envelope))
      body = None
      header = {}
      for part in envelope:
          # print(">",part.tag)
          if part.tag == '{%s}Body' % NAMESPACE:
              for sub in part:
                  try:
                      body = saml2.create_class_from_element_tree(
                              body_class, sub)
                  except Exception:
                      raise Exception(
                          "Wrong body type (%s) in SOAP envelope" % sub.tag)
          elif part.tag == '{%s}Header' % NAMESPACE:
              if not header_class:
                  raise Exception("Header where I didn't expect one")
              # print("--- HEADER ---")
              for sub in part:
                  # print(">>",sub.tag)
                  for klass in header_class:
                      # print("?{%s}%s" % (klass.c_namespace,klass.c_tag))
                      if sub.tag == "{%s}%s" % (klass.c_namespace, klass.c_tag):
                          header[sub.tag] = \
                              saml2.create_class_from_element_tree(klass, sub)
                          break
  
      return body, header
docs: Parses a SOAP enveloped SAML thing and returns header parts and body
  
      :param text: The SOAP object as XML
      :return: header parts and body as saml.samlbase instances