【发布时间】:2014-06-06 02:50:05
【问题描述】:
我正在尝试创建一个 HTML 解析器来检查 HTML 标记并验证是否存在与每个打开标记相对应的结束标记。
我现在部分工作,我相信逻辑是正确的,但我在正确获取令牌时遇到问题。当我运行我拥有的代码时,它需要很多空标记,与其他非空标记相比,显然会产生错误。
我想知道如何让它从我的 HTML 文件中读取,但只将内容放入 之间的标记中。我也不希望将任何额外数据(例如 h1 标签之间的文本)考虑在内。
这是一个学校作业,我相信教授希望我们在不使用第三方程序(如 JTidy)的情况下这样做。
非常感谢任何帮助。
import java.util.Scanner;
import java.util.StringTokenizer;
import java.io.*;
public class HTMLDriver
{
public static void main(String [] args) throws IOException
{
// declare variables
QueueReferenceBased queue = new QueueReferenceBased();
// Create a scanner object
Scanner in = new Scanner(System.in);
System.out.println("What is your html file name?");
String fileName = in.next();
File userFile = new File(fileName);
if (!userFile.exists())
{
System.out.println("File does not exist. This program will now exit.");
System.exit(0);
}
Scanner inputFile = new Scanner(userFile);
while (inputFile.hasNext())
{
String str = inputFile.nextLine();
StringTokenizer st = new StringTokenizer(str,"<>");
//Adds tokens to queue
while(st.hasMoreTokens())
{
String token = st.nextToken();
Tag t = new Tag(token);
queue.enqueue(t);
}
}
//Creates Stack
StackReferenceBased stack = new StackReferenceBased();
//Loops through queue if not empty
while(!queue.isEmpty())
{
Object obj = queue.dequeue();
Tag t2 = (Tag)obj;
if(t2.getOpen() == true)
{
stack.push(t2);
}
if(t2.getOpen() == false)
{
if(stack.isEmpty())
{
System.out.println("There is no match for the " + t2 + " tag");
}else
{
Object obj2 = stack.pop();
Tag t3 = (Tag)obj2;
//Make tag class and check equality
if(t2.getTag().equals(t3.getTag()))
{
System.out.println(t2 + " matches " + t3);
}else
{
System.out.println("Found " + t2 + " to match " + t3 + " terminating program");
System.exit(0);
}
}
}
}
}
}
【问题讨论】:
标签: java html html-parsing