input: Write a function to parse an XML document and return a list of tag objects where each tag object contains the tag id and a list of its subchild values. If the XML document is empty, return an empty list.
  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('') == []
  assert parse_xml("""<xml>
    <root>
      <child1 id="1">
        <subchild1 value="x">
        </subchild1>
        <subchild2 value="y">
        </subchild2>
      </child1>
    </root>
  </xml>""") == [Tag("1", ["x", "y"])]
  class Tag:
      def __init__(self, tag_id, values=None):
          self.tag_id = tag_id
          self.values = values if values is not None else []
      
      def __eq__(self, other):
          return self.tag_id == other.tag_id and self.values == other.values
      
      def add_value(self, value):
          self.values.append(value)
output: def parse_xml(xml_str):
      if not xml_str:
          return []
      
      from xml.etree import ElementTree as ET
      
      root = ET.fromstring(xml_str)
      tags = []
      
      for child in root.findall('.//child1') + root.findall('.//child2'):
          tag_id = child.get('id')
          subchild_values = [subchild.get('value') for subchild in child]
          tags.append(Tag(tag_id, subchild_values))
      
      return tags