input: Write a function to parse an XML document and return a list of tag objects. Each tag object should contain an id and a list of values corresponding to its subchildren. If the XML document is empty, return an empty list.
  assert parse_xml('<xml><root><child1 id="1"><subchild1 value="a"></subchild1><subchild2 value="b"></subchild2></child1><child2 id="2"><subchild3 value="c"></subchild3><subchild4 value="d"></subchild4></child2></root></xml>') == [Tag(tag_id="1", values=["a", "b"]), Tag(tag_id="2", values=["c", "d"])]
  assert parse_xml('<xml></xml>') == []
  assert parse_xml('<xml><root><child1 id="1"><subchild1 value="a"></subchild1></child1></root></xml>') == [Tag(tag_id="1", values=["a"])]
  assert parse_xml('') == []
output: def parse_xml(xml_str):
      if not xml_str:
          return []
      
      from xml.etree import ElementTree as ET
      
      root = ET.fromstring(xml_str)
      tags = []
      
      for child in root.iter():
          if 'id' in child.attrib:
              values = [subchild.attrib['value'] for subchild in child if 'value' in subchild.attrib]
              tags.append(Tag(tag_id=child.attrib['id'], values=values))
      
      return tags