input: Write a function that takes an XML string as input and returns a list of tag objects, where each tag object represents a child tag in the XML structure. The tag object should have an attribute for the tag's id and a list of values from its subchildren. 
  
  Assume the following class exists:
  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(tag_id="1", values=["a", "b"]),
      Tag(tag_id="2", values=["c", "d"])
  ]
output: def parse_xml(xml_string):
      import xml.etree.ElementTree as ET
      root = ET.fromstring(xml_string)
      tags = []
      for child in root.findall('.//root/*'):
          tag = Tag(child.attrib['id'])
          for subchild in child:
              tag.add_value(subchild.attrib['value'])
          tags.append(tag)
      return tags