Skip required body field validation
Why don't you simply go to Structure -> Content Types -> [Your type] -> Manage Fields -> Body -> Edit uncheck "Required field"? Since Drupal 7, body behaves as any other field...

If you really need to do this in code, then you do it in form_alter like this:

function [mymodule]_form_alter(&amp;$form, &amp;$form_state, $form_id) {
  // some logic here to filter which form is affected (or use hook_form_FORM_ID_alter)
  $form['body'][LANGUAGE_NONE][0]['#required'] = FALSE;
}


Is there any particular reason for you to do it during validation and not on form render? You stated that you need to "skip required body field validation, if it's empty" which is equivalent to turning the "required" completely.

EDIT:
I found a way to do this (based on this - https://api.drupal.org/comment/28464#comment-28464):

function my_validate($form, &amp;$form_state) {
  $errors = form_get_errors();

  if ($errors) {
    // Clear errors.
    form_clear_error();
    // Clear error messages.
    $error_messages = drupal_get_messages('error');
    // Initialize an array where removed error messages are stored.
    $removed_messages = array();


    // Remove all errors originated by the 'foo][bar' element.
    foreach ($errors as $name =&gt; $error_message) {
      if ($name == 'body][und][0][value') {
        $removed_messages[] = $error_message;
        unset($errors[$name]);
      }
    }


    // Reinstate remaining errors.
    foreach ($errors as $name =&gt; $error) {
      form_set_error($name, $error);
      // form_set_error() calls drupal_set_message(), so we have to filter out
      // these from the error messages as well.
      $removed_messages[] = $error;
    }


    // Reinstate remaining error messages (which, at this point, are messages that
    // were originated outside of the validation process).
    foreach (array_diff($error_messages['error'], $removed_messages) as $message) {
      drupal_set_message($message, 'error');
    }
  }
}