code: def _ParseFileEntry(self, knowledge_base, file_entry):
      
      root_key = self._GetPlistRootKey(file_entry)
      if not root_key:
        location = getattr(file_entry.path_spec, 'location', '')
        raise errors.PreProcessFail((
            'Unable to read: {0:s} plist: {1:s} with error: missing root '
            'key.').format(self.ARTIFACT_DEFINITION_NAME, location))
  
      try:
        match = self._GetKeysDefaultEmpty(root_key, self._KEYS)
      except KeyError as exception:
        location = getattr(file_entry.path_spec, 'location', '')
        raise errors.PreProcessFail(
            'Unable to read: {0:s} plist: {1:s} with error: {2!s}'.format(
                self.ARTIFACT_DEFINITION_NAME, location, exception))
  
      name = match.get('name', [None])[0]
      uid = match.get('uid', [None])[0]
  
      if not name or not uid:
        # TODO: add and store preprocessing errors.
        return
  
      user_account = artifacts.UserAccountArtifact(
          identifier=uid, username=name)
      user_account.group_identifier = match.get('gid', [None])[0]
      user_account.full_name = match.get('realname', [None])[0]
      user_account.shell = match.get('shell', [None])[0]
      user_account.user_directory = match.get('home', [None])[0]
  
      try:
        knowledge_base.AddUserAccount(user_account)
      except KeyError:
        # TODO: add and store preprocessing errors.
        pass
docs: Parses artifact file system data for a preprocessing attribute.
  
      Args:
        knowledge_base (KnowledgeBase): to fill with preprocessing information.
        file_entry (dfvfs.FileEntry): file entry that contains the artifact
            value data.
  
      Raises:
        errors.PreProcessFail: if the preprocessing fails.