input: from typing import List
  
  def parse_xml(text: str) -> List['Tag']:
      """ Parses an XML document and returns a list of tag objects.
      Each tag object contains an id and a list of values associated with its subchildren.
      >>> 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(id=1, values=['a', 'b']), Tag(id=2, values=['c', 'd'])]
      """
      
  class Tag:
      def __init__(self, tag_id: str):
          self.tag_id = tag_id
          self.values = []
      
      def add_value(self, value: str):
          self.values.append(value)
      
      def __repr__(self):
          return f"Tag(id={self.tag_id}, values={self.values})"
output:     import xml.etree.ElementTree as ET
  
      root = ET.fromstring(text)
      tags = []
  
      for child in root.findall('.//child1'):
          tag_id = child.attrib['id']
          tag = Tag(tag_id)
          for subchild in child:
              tag.add_value(subchild.attrib['value'])
          tags.append(tag)
  
      for child in root.findall('.//child2'):
          tag_id = child.attrib['id']
          tag = Tag(tag_id)
          for subchild in child:
              tag.add_value(subchild.attrib['value'])
          tags.append(tag)
  
      return tags