如何在JAVA中确定HTML文档是否格式良好?

时间:2011-03-01 12:38:06

标签: java html-parsing well-formed non-well-formed

Heyy伙计们,我需要确定给定的HTML文档是否格式正确 我只需要一个简单的实现,只使用Java核心API类,即没有第三方的东西,如JTIDY或其他东西。感谢。

实际上,究竟需要的是一种扫描TAGS列表的算法。如果它找到一个打开的标签,并且下一个标签不是其对应的关闭标签,那么它应该是另一个开放标签,而后者应该将其关闭标签作为下一个标签,如果不是,则应该是另一个开放标签然后其对应的关闭标记接下来,并且列表中接下来的相反顺序的先前打开标记的关闭标记。我已经编写了将标记转换为关闭标记的方法。如果列表符合此顺序,则返回true或false。

这是我已经开始研究的骨架代码。它不是太整洁,但它应该给你们一个基本的想法,我正在尝试做什么。

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 个答案:

答案 0 :(得分:1)

是的字符串操作有时看起来像泡菜 你需要做一些像

这样的事情

首先将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;
  }
}

像这样的东西应该让你开始,你应该最终得到一个标签数组,这只是伪代码,所以它不应该编译

答案 1 :(得分:0)

不认为如果不进行大量工作就可以做到这一点,使用第三方软件包会更容易

答案 2 :(得分:0)

尝试验证HTML4或4.1或XHTML 1 DTD

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

这可能有所帮助!

答案 3 :(得分:0)

也许您可以根据自己的需要调整this example