code: def update_property(tree_to_update, xpath_root, xpaths, prop, values, supported=None):
      
  
      if supported and prop.startswith('_') and prop.strip('_') in supported:
          values = u''  # Remove alternate elements: write values only to primary location
      else:
          values = get_default_for(prop, values)  # Enforce defaults as required per property
  
      if not xpaths:
          return []
      elif not isinstance(xpaths, ParserProperty):
          return _update_property(tree_to_update, xpath_root, xpaths, values)
      else:
          # Call ParserProperty.set_prop without xpath_root (managed internally)
          return xpaths.set_prop(tree_to_update=tree_to_update, prop=prop, values=values)
docs: Either update the tree the default way, or call the custom updater
  
      Default Way: Existing values in the tree are overwritten. If xpaths contains a single path,
      then each value is written to the tree at that path. If xpaths contains a list of xpaths,
      then the values corresponding to each xpath index are written to their respective locations.
      In either case, empty values are ignored.
  
      :param tree_to_update: the XML tree compatible with element_utils to be updated
      :param xpath_root: the XPATH location shared by all the xpaths passed in
      :param xpaths: a string or a list of strings representing the XPATH location(s) to which to write values
      :param prop: the name of the property of the parser containing the value(s) with which to update the tree
      :param values: a single value, or a list of values to write to the specified XPATHs
  
      :see: ParserProperty for more on custom updaters
  
      :return: a list of all elements updated by this operation