Railo instanceof不与Jsoup合作

时间:2013-02-23 01:33:31

标签: jsoup railo cfml

我正在使用tomcat和Railo运行Linux服务器。如果我尝试这个简单的代码:

check = "";
jSoupClass = createObject( "java", "org.jsoup.Jsoup" );

if(IsInstanceOf(jSoupClass,"org.jsoup.Jsoup")){
 check = "ok";      
}

writeDump(check );

如果我运行这个简单的代码,var check总是为空。我使用许多java类运行这个简单的测试,并且完美运行。

在我的应用程序中,我使用jsoup没有问题,但似乎无法运行这个简单的检查。我用它来检查文档的doctype:

jSoupClass = createObject( "java", "org.jsoup.Jsoup" );
dom = jSoupClass.connect( "http://www.mutuiinpdap.net" ).userAgent("Mozilla/5.0 (Windows; U; WindowsNT 5.1; en-US; rv1.8.1.6) Gecko/20070725 Firefox/2.0.0.6").timeout(10000).execute();

doc = dom.parse();
nods = doc.childNodes();
doctype = {};
for (key in nods) {
  if(IsInstanceOf(key,"org.jsoup.nodes.DocumentType")){
doctype.string = key.toString();
switch(key) {
 case "<!DOCTYPE html>":
      doctype.declarations = "Html 5";
  break;
     case '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">':
  doctype.declarations = "XHTML transitional";
  break;
    }
   }
  }

writeDump(doctype);

有没有办法解决这个问题?我可以使用不同的代码来检查哪个doctype是文档吗?

此代码在我的本地Windows计算机上运行完美。但是在我的生产服务器上安装了Ubuntu就打破了......

[编辑]

我也测试过这段代码:

public function getDoctype(){



 myClass = {};


jSoupClass = createObject( "java", "org.jsoup.Jsoup" );
whois = createObject("java", "org.apache.commons.net.whois.WhoisClient");



myClass.jj = "ko";
myClass.ww = "ko";



writeDump(jSoupClass);  
writeDump(whois);   

if(IsInstanceOf(jSoupClass,"org.jsoup.Jsoup")){
    myClass.jj = "ok";      
}


if(IsInstanceOf(whois,"org.apache.commons.net.whois.WhoisClient")){
    myClass.ww = "ok";      
}


return myClass;

}

我会得到一个myClass.jj =“ko”;和myClass.ww =“ok”;

2 个答案:

答案 0 :(得分:1)

要使DOCTYPE有效,它必须是文档中的第一件事,因此不需要循环检查实例的节点。

您需要做的就是检查第一个标记 - 即第一个>字符之前的HTML字符串的内容(或者,对于某些XHTML,在第一个和第二个>之间检查)

您也不需要(或想要)一长串完整的doctype声明。除了HTML 5之外,它们都遵循相同的模式(即具有DTD),因此您只需从doctype中提取名称。

我把这个逻辑包含在下面发布的函数中 - 可能需要一些调整或额外的工作来执行你需要的工作,但它已经过简单测试并且有效。希望这一切都是不言自明的,但如果没有任何部分,请告诉我。

jSoupClass = createObject( "java" , "org.jsoup.Jsoup" , "./jsoup-1.7.1.jar" );

doc = jSoupClass
    .connect( "http://www.mutuiinpdap.net" )
    .userAgent("Mozilla/5.0 (Windows; U; WindowsNT 5.1; en-US; rv1.8.1.6) Gecko/20070725 Firefox/2.0.0.6")
    .timeout(10000)
    .execute()
    ;

doctype = determineDoctype( doc.body() );

writeDump(doctype);



function determineDoctype( Html )
{

    var FirstTag = trim(ListFirst(Arguments.Html,'>'));

    if ( LCase(trim(FirstTag)) EQ '<!doctype html' )
        return 'Html 5';

    if ( Left(FirstTag,5) EQ '<?xml' )
        FirstTag = trim(ListGetAt(Arguments.Html,2,'>'));

    if ( Left(LCase(FirstTag),14) NEQ '<!doctype html' )
        return 'Non-HTML doctype [#FirstTag#]' ;

    var dtd = rematch('-//W3C//DTD [^/]+',FirstTag);

    if ( ArrayLen(dtd) )
        return ListRest(dtd[1],' ');

    return 'Unknown Doctype [#FirstTag#]';
}

答案 1 :(得分:1)

您可以测试object.getClass().getName() EQ 'org.jsoup.Jsoup'以查看该课程是否符合预期。

即使这可以解决您的代码问题,我仍然会推荐我发布的用于确定doctype的其他答案。