code: def parse_event_xml(xml_event):
      result = {}
      tree = XML.fromstring(xml_event)
      properties = tree.findall(
          '{urn:schemas-upnp-org:event-1-0}property')
      for prop in properties:
          for variable in prop:
              if variable.tag == "LastChange":
                  last_change_tree = XML.fromstring(
                      variable.text.encode('utf-8'))
                  instance = last_change_tree.find(
                      "{urn:schemas-upnp-org:metadata-1-0/AVT/}InstanceID")
                  if instance is None:
                      instance = last_change_tree.find(
                          "{urn:schemas-upnp-org:metadata-1-0/RCS/}InstanceID")
                  if instance is None:
                      instance = last_change_tree.find(
                          "{urn:schemas-sonos-com:metadata-1-0/Queue/}QueueID")
                  for last_change_var in instance:
                      tag = last_change_var.tag
                      if tag.startswith('{'):
                          tag = tag.split('}', 1)[1]
                      tag = camel_to_underscore(tag)
                      value = last_change_var.get('val')
                      if value is None:
                          value = last_change_var.text
                      if value.startswith('<DIDL-Lite'):
                          try:
                              didl = from_didl_string(value)
                              if not didl:
                                  continue
                              value = didl[0]
                          except SoCoException as original_exception:
                              log.debug("Event contains illegal metadata"
                                        "for '%s'.\n"
                                        "Error message: '%s'\n"
                                        "The result will be a SoCoFault.",
                                        tag, str(original_exception))
                              event_parse_exception = EventParseException(
                                  tag, value, original_exception
                              )
                              value = SoCoFault(event_parse_exception)
                      channel = last_change_var.get('channel')
                      if channel is not None:
                          if result.get(tag) is None:
                              result[tag] = {}
                          result[tag][channel] = value
                      else:
                          result[tag] = value
              else:
                  result[camel_to_underscore(variable.tag)] = variable.text
      return result