code: def parse_property(tree_to_parse, xpath_root, xpath_map, prop):
      
  
      xpath = xpath_map[prop]
  
      if isinstance(xpath, ParserProperty):
          if xpath.xpath is None:
              return xpath.get_prop(prop)
  
          xpath = xpath.xpath
  
      if xpath_root:
          xpath = get_xpath_branch(xpath_root, xpath)
  
      parsed = None
  
      if not has_property(tree_to_parse, xpath):
          # Element has no text: try next alternate location
  
          alternate = '_' + prop
          if alternate in xpath_map:
              return parse_property(tree_to_parse, xpath_root, xpath_map, alternate)
  
      elif '@' not in xpath:
          parsed = get_elements_text(tree_to_parse, xpath)
      else:
          xroot, xattr = get_xpath_tuple(xpath)
          parsed = get_elements_attributes(tree_to_parse, xroot, xattr)
  
      return get_default_for(prop, parsed)
docs: Defines the default parsing behavior for metadata values.
      :param tree_to_parse: the XML tree compatible with element_utils to be parsed
      :param xpath_root: used to determine the relative XPATH location within the parent element
      :param xpath_map: a dict of XPATHs that may contain alternate locations for a property
      :param prop: the property to parse: corresponds to a key in xpath_map