input: Write a function to parse an XML document and return a list of tag objects. Each tag object should contain an `id` attribute and a list of `values` extracted from its subchild elements. If the input XML is empty or cannot be parsed, the function should 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_id': '1', 'values': ['a', 'b']}, {'tag_id': '2', 'values': ['c', 'd']}]
  assert parse_xml('<xml></xml>') == []
  assert parse_xml('') == []
  
output: def parse_xml(xml_str):
      if not xml_str:
          return []
      
      try:
          from xml.etree import ElementTree as ET
          root = ET.fromstring(xml_str)
      except:
          return []
      
      tags = []
      for child in root:
          tag_id = child.attrib.get('id')
          values = [subchild.attrib.get('value') for subchild in child]
          tags.append({'tag_id': tag_id, 'values': values})
      
      return tags