0

我正在运行一个带有 tomcat 和 Railo 的 linux 服务器。如果我尝试这个简单的代码:

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

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

writeDump(check );

如果我运行这个简单的代码,varcheck总是空的。我用许多 java 类运行这个简单的测试,并且一切正常。

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

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";

4

2 回答 2

1

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

即使这可以解决您的代码问题,我仍然会推荐我发布的其他答案来确定文档类型。

于 2013-02-23T16:14:36.600 回答
1

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

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

您也不需要(或想要)一长串完整的 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#]';
}
于 2013-02-23T12:57:15.273 回答