input: 
  from typing import List
  import xml.etree.ElementTree as ET
  
  def parse_xml(text: str) -> List['Tag']:
      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: str):
          self.tag_id = tag_id
          self.values = []
      
      def add_value(self, value: str):
          self.values.append(value)
  
  # Example test case
  xml_text = """<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>"""
  
  expected_output = [
      {'tag_id': '1', 'values': ['a', 'b']},
      {'tag_id': '2', 'values': ['c', 'd']}
  ]
  
  # Actual output
  parsed_tags = parse_xml(xml_text)
  output = [{'tag_id': tag.tag_id, 'values': tag.values} for tag in parsed_tags]
  
  assert output == expected_output, f"Expected {expected_output}, but got {output}"
  
output:     
      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
  