input: Write a function called parse_xml that takes a string representation of an XML document and returns a list of Tag objects. Each Tag object should represent a tag in the XML document, with its id and a list of values from its subchildren. If the input XML document is empty, the function should return an empty list.
  
  assert parse_xml("<xml><root><child1 id=\"1\"><subchild1 value=\"a\"></subchild1></child1></root></xml>") == [Tag("1", ["a"])]
  assert parse_xml("<xml><root><child1 id=\"1\"><subchild1 value=\"a\"></subchild1><subchild2 value=\"b\"></subchild2></child1></root></xml>") == [Tag("1", ["a", "b"])]
  assert parse_xml("<xml><root><child1 id=\"1\"><subchild1 value=\"a\"></subchild1></child1><child2 id=\"2\"><subchild3 value=\"c\"></subchild3></child2></root></xml>") == [Tag("1", ["a"]), Tag("2", ["c"])]
  assert parse_xml("<xml><root></root></xml>") == []
  assert parse_xml("") == []
output: 
  def parse_xml(xml_str):
      from xml.etree import ElementTree as ET
      class Tag:
          def __init__(self, id, values):
              self.id = id
              self.values = values
          def __eq__(self, other):
              return self.id == other.id and self.values == other.values
      if not xml_str:
          return []
      root = ET.fromstring(xml_str)
      tags = []
      for child in root.findall(".//child1"):
          id = child.attrib['id']
          values = [subchild.attrib['value'] for subchild in child.findall(".//subchild1")]
          tags.append(Tag(id, values))
      return tags
  