Programa em Java que leia um ficheiro em HTML

Boa tarde pessoal!!!
Tenho uma avaliação do curso de JAVA para entregar mas estou completamente perdida!
Alguém me pode ajudar???
O pedido é :
Escreva um programa em Java que leia um ficheiro em HTML e determine se o seu conteúdo é válido ou se
contêm erros.
O HTML, ou HyperText Markup Language, é a linguagem em que as páginas Web são escritas. Numa página
pode existir texto misturado com tags ou marcas. As tags aparecem usualmente aos pares e entre <>.
Página 2 | 3

Exemplo:

<P>Isto é um parágrafo <BOLD>com uma parte a negrito.</BOLD></P>
Contém duas tags <P> e <BOLD>. Para cada tag deve existir uma tag equivalente de fecho (neste caso </P>
e </BOLD>

As tags devem estar devidamente encadeadas, como no exemplo.
Deve produzir a listagem dos erros encontrados ou uma mensagem a dizer que o ficheiro é válido, no caso
contrário.

eu acho que eu ja fiz uma coisa assim, mas ja tem quase 20 anos. Nem lembro mais. O que voce pode fazer eh abrir o arquivo com os metodos padroes de leitura de arquivo, e a cada linha pega a tag que abre ela <> e verifica se ela em fechamento </>

acredito que voce tenha que fazer manual. mas tem blibliotecas que fazem essa verificacao.

(https://stackoverflow.com/questions/4392505/how-to-validate-html-from-java)

package ficheiros;

	import java.io.*; 
	import javax.swing.JOptionPane;

	public class LeArq{
		public static void main (String[]args){
			try{
				
				String nome;
				nome = JOptionPane.showInputDialog(null,"Entre com o nome do arquivo");
				
				BufferedReader br = new BufferedReader(new FileReader(nome));
				while(br.ready()){
					String linha = br.readLine();
					System.out.println(linha);`Texto pré-formatado`

Já comecei o programa mas está difícil de o fazer ler e analisar.
Abrir o ficheiro HTML está ok. Mas o resto alguém pode ajudar???

o que é suposto é :

HELP! @Iohannes @Jelson1 @WillianC19
Ficarei grata!

@Sonia_Santos nesse tipo de situação é muito complicado alguém te ajudar, porque seria necessário alguém criar todo o programa para você. E isso é um projeto, então demanda um pouco de tempo e planejamento, o máximo que alguém pode fazer é sugerir dicas de como fazer, como o Thimor fez! Seria mais fácil se tivesse algo pronto, mas com erro específicos para alguém te ajudar!

Contudo, fiz esse exemplo para você. Partindo da ideia de comparar as tags de abertura (<>) e fechamento ( </>). Talvez tenha dificuldades para entender. O que você deve saber antes:

  1. Você terá que adaptar para o seu projeto ou usar como base;
  2. Para testes eu usei um método de leitura diferente do que você apresentou;
  3. Eu usei regex, e os métodos pattern e matcher, se não conhece dá uma pesquisada;
  4. Esse exemplo aborda três tipos de erros e não fiz muitos testes.

import java.util.Scanner;
import java.util.ArrayList;
import java.util.Stack;
import java.util.regex.Pattern;
import java.util.regex.Matcher;

class Main{
  private static String ERRO_01 = "Tag %s vazia, linha %d!";
  private static String ERRO_02 = "Tag %s fechada mas não  aberta, linha %d!";
  private static String ERRO_03 = "Tags %s e %s diferentes, linha %d!";
  
  private ArrayList<String> listaErros;
  private Stack<String> pilhaTags;
  
  public void verificar(String html){
    
    listaErros = new ArrayList<>();
    pilhaTags = new Stack<>();
    
    Scanner scan = new Scanner(html);
    
    int index = 0;
    
    while(scan.hasNext()){
      index++;
      String linha = scan.nextLine();
      verificarHtml(linha, index);
    }
    
    if(listaErros.isEmpty() && pilhaTags.isEmpty()){
      System.out.println("Html Válido");
    }
    
    //Mostra todos os erros
    for(String s : listaErros){
      System.out.println(s);
    }
    
    //Tags não fechadas!
    if(!pilhaTags.isEmpty()){
      System.out.println("ALERTA: algumas tags não foram fechadas");
    }
    
    scan.close();
  }
  
  private void verificarHtml(String linha, int index){
    
    Pattern pattern = Pattern.compile("(</?)(\\w*)>");
    Matcher matcher = pattern.matcher(linha);
    
    while(matcher.find()){
      
      String tagInicio = matcher.group(1);
      String tagNome = matcher.group(2);
      
      //verifica tags vazias "<> ou </>"
      if(tagNome.isEmpty()){
         listaErros.add(String.format(ERRO_01,tagCompleta,index));
         continue;
      }
      
      //add tag de abertura a pilha
      if(tagInicio.equals("<")){
        pilhaTags.push(tagNome);
      }
      
      //Comparar comparar tags de fechamento e abertura
      else{
        verificarTags(tagNome,index);
      }
    }
  }
  
  private void verificarTags(String tagEndNome, int index){
    if(pilhaTags.isEmpty()){
      String msg = String.format(ERRO_02,"</"+tagEndNome+">",index);
      listaErros.add(msg);
      return;
    }
    
    String tagStartNome = pilhaTags.pop();
    
    //Se as tags forem diferentes
    if(!tagStartNome.equals(tagEndNome)){
      String tagStart = "<"+ tagStartNome + ">";
      String tagEnd = "</"+ tagEndNome + ">";
      
      listaErros.add(String.format(ERRO_03,tagStart,tagEnd,index));
    }
  }
  
  public static void main(String[] args) {
    
    String html1 = "<P>Isto é um parágrafo <BOLD>com uma parte a negrito.</BOLD></P>";                 
    String html2 = "<p>Teste</b> \n <h1>teste2 teste2</h3>";
    String html3 = "<p>test3<>\n<p><b>teste3</b></p>";
    
    Main main = new Main();
    
    System.out.println("Html1:");
    main.verificar(html1);
    
    System.out.println();
    
    System.out.println("Html2:");
    main.verificar(html2);
    
    System.out.println();
    
    System.out.println("HTML3:");
    main.verificar(html3);
  }
}

1 curtida

Obrigado @Jelson1! Já foi uma grande ajuda!

@Sonia_Santos
:coffee:
Boa tarde, quase não tive tempo esses dias para entrar aqui na GUJ, vi que o pessoal já apresentou um bom modelo desenvolvido para realizar a tarefa que você mencionou, mas se precisar de tirar alguma dúvida, avisa aí que te dou uma força também!
:v: