input: Write a function to parse an XML document and return a list of tag objects. Each tag object should have an `id` attribute and a list of values corresponding to its sub-tags. If the input XML 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>") == [{'id': '1', 'values': ['a', 'b']}, {'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>") == [{'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)
      result = []
      
      for child in root.findall('.//child1') + root.findall('.//child2'):
          tag_id = child.get('id')
          values = [subchild.get('value') for subchild in child]
          result.append({'id': tag_id, 'values': values})
      
      return result