code: def elem_to_internal(elem, strip_ns=1, strip=1):
      
  
      d = {}
      elem_tag = elem.tag
      if strip_ns:
          elem_tag = strip_tag(elem.tag)
      else:
          for key, value in list(elem.attrib.items()):
              d['@' + key] = value
  
      # loop over subelements to merge them
      for subelem in elem:
          v = elem_to_internal(subelem, strip_ns=strip_ns, strip=strip)
  
          tag = subelem.tag
          if strip_ns:
              tag = strip_tag(subelem.tag)
  
          value = v[tag]
  
          try:
              # add to existing list for this tag
              d[tag].append(value)
          except AttributeError:
              # turn existing entry into a list
              d[tag] = [d[tag], value]
          except KeyError:
              # add a new non-list entry
              d[tag] = value
      text = elem.text
      tail = elem.tail
      if strip:
          # ignore leading and trailing whitespace
          if text:
              text = text.strip()
          if tail:
              tail = tail.strip()
  
      if tail:
          d['#tail'] = tail
  
      if d:
          # use #text element if other attributes exist
          if text:
              d["#text"] = text
      else:
          # text is the value if no attributes
          d = text or None
      return {elem_tag: d}
docs: Convert an Element into an internal dictionary (not JSON!).