我正在使用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”;
答案 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的其他答案。