Как я могу определить, правильно ли сформирован HTML-документ в JAVA? - PullRequest
0 голосов
/ 01 марта 2011

Эй, ребята, мне нужно определить, правильно ли задан HTML-документ.
Мне просто нужна простая реализация, использующая только классы API ядра Java, то есть никаких сторонних программ, таких как JTIDY или что-то в этом роде. Благодаря.

На самом деле, что именно нужно, так это алгоритм, который сканирует список тегов. Если он находит открытый тег, а следующий тег не соответствует соответствующему тегу закрытия, то это должен быть другой открытый тег, который в свою очередь должен иметь свой закрывающий тег в качестве следующего тега, а если нет, то это должен быть другой открытый тег его соответствующий закрывающий тег next и закрывающие теги предыдущих открытых тегов в обратном порядке следуют далее по списку. Я уже написал методы для преобразования тега в закрывающий тег. Если список соответствует этому порядку, он возвращает истину или ложь.

Вот скелетный код того, над чем я уже начал работать. Это не слишком аккуратно, но это должно дать вам, ребята, основную идею о том, что я пытаюсь сделать.

public boolean validateHtml(){

    ArrayList<String> tags = fetchTags();
    //fetchTags returns this [<html>, <head>, <title>, </title>, </head>, <body>, <h1>, </h1>, </body>, </html>]

    //I create another ArrayList to store tags that I haven't found its corresponding close tag yet
    ArrayList<String> unclosedTags = new ArrayList<String>();

    String temp;

    for (int i = 0; i < tags.size(); i++) {

        temp = tags.get(i);

        if(!tags.get(i+1).equals(TagOperations.convertToCloseTag(tags.get(i)))){
            unclosedTags.add(tags.get(i));
            if(){

            }

        }else{
            return true;//well formed html
        }
    }

    return true;
}

Ответы [ 4 ]

1 голос
/ 01 марта 2011

Да, манипуляции со строками иногда могут показаться маринованными, вам нужно сделать что-то вроде

Сначала скопируйте html в массив

bool tag = false;
string str = "";
List<string> htmlTags = new List();

for(int i = 0; i < array.length; i++)
{ 
  //Check for the start of a tag
  if(array[i] == '<')
  {
    tag == true;
  }

  //If the current char is part of a tag start copying
  if(tag)
  {
    str += char;
  }

  //When a tag ends add the tag to your tag list
  if(array[i] == '>')
  {
    htmlTags.Add(str);
    str = "";
    tag == false;
  }
}

Что-то вроде этого должно начать васв конечном итоге с массивом тегов, это всего лишь псевдокод, поэтому он не должен компилироваться

0 голосов
/ 01 марта 2011

Возможно, вы сможете адаптировать этот пример к вашим потребностям.

0 голосов
/ 01 марта 2011

Попробуйте проверить по HTML4 или 4.1 или XHTML 1 DTD

"strict.dtd"
"loose.dtd"
"frameset.dtd"

Что может помочь!

0 голосов
/ 01 марта 2011

Не думайте, что вы можете сделать это без огромного объема работы, было бы намного проще использовать сторонний пакет

...