2010-02-17 56 views
0

我知道我可能在这里非常愚蠢,但任何人都可以解释我的问题吗?我试图从包含html的字符串中提取标题...Java StringTokenizer的麻烦 - 新手

public static void main(String args[]) { 
    System.out.println(getTitle("<title>this is it</title>")); 
} 

public static String getTitle(String a) { 
    StringTokenizer token = new StringTokenizer(a, "<title>", false); 
    return token.nextToken("</title>"); 
} 

不停地返回“h”,我不知道为什么!我很天真吗?

干杯

+3

如果您尝试进行的操作不仅限于HTML解析,还可以使用第三方库来完成。 –

+0

基本上所有我需要待办事项是提取标题,并链接目前在网页上..你能建议任何简单的图书馆,让我这样做吗?谢谢 – Andy

回答

2

我认为你的问题就出在这里(引自the API doc,文字由我加粗):

“的组分隔符的既可以在创建指定(即单独标记的字符)时间或每个代币的基础上。“

也就是说,分隔符不是一个字符串,而是一组字符。当你通过"<title>"作为第二个参数,你告诉你的标记生成器的分隔符是任何字符<title>的。因此,令牌生成器会尽快跳过第一个标签中的所有字符,然后返回t,并返回h,因为它不在您给它的令牌集合中,但下一个字符(e)是。

所以StringTokenizer是不是你在这里所需要的。还要注意这句话从API文档:

StringTokenizer是保留兼容性的原因,虽然它的使用是在新代码气馁遗留类建议任何寻求此功能使用的String或在split方法。代替java.util.regex包。“

或者使用第三方库,正如他人已经注意到的那样。

2

我不确定StringTokenizer是否是您的方案中使用的最佳类。也许你可以通过使用String.subString(int,int)来解决你的任务。正如BearsWillEatYou指出的,如果你想做更复杂的HTML解析,使用一些第三方库。

public static void main(String args[]) { 
    System.out.println(getTitle("<title>this is it</title>")); 
} 

public static String getTitle(String a) { 
    return a.substring(a.indexOf("<title>") + "<title>".length(), a.indexOf("</title>")) 
} 
0

您不能这样使用StringTokenizer。请参阅javadoc http://java.sun.com/j2se/1.4.2/docs/api/java/util/StringTokenizer.html

delims参数包含在字符串中被视为分隔符的一组字符。因此,在这里,您有“<”,“t”,“i”,...作为分隔符。

对于那种工作,你真的应该考虑使用html或xml专用库。 您也可以使用“<>”作为分隔符,并实现最小化的html解析器,以满足您的需求,但这可能会导致错误,头痛和更多的错误,一旦您的最小需求扩展。

0

如果您解析HTML,最好的方法可能是HTML Cleaner, according to this SO post

我会推荐使用这个域特定的库,因为它也会给你一个简单的方法来在需要时扩展你的应用程序的功能。或者,如果这也解析HTML,可以帮助您使用其他应用程序。