input: 
  from typing import List
  import xml.etree.ElementTree as ET
  
  def parse_xml_and_return_tags(xml_text: str) -> List['Tag']:
      """
      Parse an XML document given as a string and return a list of Tag objects.
      Each Tag object corresponds to a child element in the XML with 'id' attribute
      and includes its subchild elements' 'value' attributes.
  
      >>> xml_input = '''<xml>
      ...   <root>
      ...     <child1 id="1">
      ...       <subchild1 value="a"/>
      ...       <subchild2 value="b"/>
      ...     </child1>
      ...     <child2 id="2">
      ...       <subchild3 value="c"/>
      ...       <subchild4 value="d"/>
      ...     </child2>
      ...   </root>
      ... </xml>'''
      >>> tags = parse_xml_and_return_tags(xml_input)
      >>> [tag.tag_id for tag in tags]
      ['1', '2']
      >>> [tag.values for tag in tags]
      [['a', 'b'], ['c', 'd']]
      """
  
      class Tag:
          def __init__(self, tag_id):
              self.tag_id = tag_id
              self.values = []
          
          def add_value(self, value):
              self.values.append(value)
      
      tag_objects = []
      root = ET.fromstring(xml_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
  
output:     class Tag:
          def __init__(self, tag_id):
              self.tag_id = tag_id
              self.values = []
          
          def add_value(self, value):
              self.values.append(value)
      
      tag_objects = []
      root = ET.fromstring(xml_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