我正在尝试创建一个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);
}
}
}
}
}
}
答案 0 :(得分:0)
不要这样做。 Html在这方面臭名昭着。一些标签没有打开/关闭&lt; &GT; - 然后就是所有格式错误的HTML和浏览器怪异。
除非你的教授明确地将你排除在使用第三方免费软件之外,否则这是一种疯狂的尝试。在XML上,这是可管理的。
如果你真的,真的必须自己做这件事,可以使用正则表达式获得不错的结果
Pattern p = Pattern.compile("<(.*)>") // will get your started. you can then do:
Matcher m = p.matcher();
m.group( ... ) // this will get you everything between parentheses in the regex