Удалось ли кому нибудь пройти валидацию реализовав поиск через Jsoup? Ну, и если не сложно помочь добить 5 пункт таким способом.
String printText = String.valueOf(str).replaceAll("\n","");
        char [] text = printText.toCharArray();
        char [] openT = ("<"+args[0]).toCharArray();
        char [] closeT = ("</"+args[0]+">").toCharArray();
        List<Integer> indexOpen = new ArrayList<>(); // индексы открывающего тега
        List<Integer> indexClose = new ArrayList<>(); // индексы закрывающего тега
        Stack<Integer> tag = new Stack<>(); // стек на индексы вложенных тегов
        int countOpen = 0; // переменная счетчика на открытие тега
        int countClose = 0; //переменная счетчика на закрытие тега
        int tagNum =0;     // переменная счетчика на вложенность тегов
        for (int i =0; i<text.length;i++){

         if(countClose==closeT.length-1 && tagNum==1){ // если закрывается тег и нет вложеных
                 countClose = 0; tagNum--;
             indexClose.add(i+1);
              while (!tag.empty()){
                  indexClose.add(tag.pop());
              }
            } else if(countClose==closeT.length-1){ // если закрывается и есть вложенные
             tag.push(i+1); tagNum--; countClose =0;
         }

            if(countOpen==openT.length-1){ // если открывается тег
                indexOpen.add(i-openT.length+1); countOpen = 0; tagNum++;}

            if(text[i]==openT[countOpen]){ // счетчик на открытие
                countOpen++; } else { countOpen = 0;  }

            if(text[i]==closeT[countClose]){ // счетчик на закрытие
                countClose++;} else  {countClose = 0;}

        }

       // печать по индексам
        for (int i= 0;i<indexClose.size();i++ ){
            System.out.println(printText.substring(indexOpen.get(i),indexClose.get(i)));
        }
    }
}