input: Write a function to parse an XML document and return a list of tag objects. Each tag object should contain the tag's ID and a list of its subchildren's values. If the XML document is empty, return an empty list.
  
  import xml.etree.ElementTree as ET
  
  def parse_xml(text):
      tag_objects = []
  
      root = ET.fromstring(text)
      for child in root:
          tag = Tag(child.attrib["id"])
          for subchild in child:
              tag.add_value(subchild.attrib["value"])
          tag_objects.append(tag)
  
      return tag_objects
  
  class Tag:
      def __init__(self, tag_id):
          self.tag_id = tag_id
          self.values = []
      
      def add_value(self, value):
          self.values.append(value)
  
  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('1', ['a', 'b']), Tag('2', ['c', 'd'])]
  assert parse_xml("") == []
  
output: def parse_xml(text):
      tag_objects = []
      if not text:
          return tag_objects
  
      root = ET.fromstring(text)
      for child in root:
          tag = Tag(child.attrib["id"])
          for subchild in child:
              tag.add_value(subchild.attrib["value"])
          tag_objects.append(tag)
  
      return tag_objects