2013-02-23 4 views
0

Tomcat 및 Railo가 포함 된 Linux 서버를 실행하고 있습니다. 나는이 간단한 코드하려고하면 :이 간단한 코드를 실행하면Railo instanceof가 Jsoup와 작동하지 않습니다.

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

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

writeDump(check); 

을 VAR check은 항상 비어 있습니다. 나는 많은 자바 클래스와 완벽하게 작동하는이 간단한 테스트를 실행한다.

내 응용 프로그램에서는 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 컴퓨터에서 완벽하게 실행됩니다. 그러나 나누기에 설치된 우분투 내 프로덕션 서버 ...에

[편집]이 코드로도 테스트 한

:

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"; and myClass.ww = "ok";

+0

isInstanceOf가 작동하지 않는 이유를 알 수 없습니다. 특히 하나의 설치에서는 작동하지만 다른 제품에서는 작동하지 않는 경우에는 볼 수 없습니다. - 관련 버그가있는 [버그 제기] (https://issues.jboss.org/browse/RAILO) 세부. –

+0

Relevan 세부 정보가있는 버그를 제기하고 싶습니다. 추가 할 내용은 많지 않습니다. try/catch를 내 코드에 추가하여 잘못된 내용을 확인했지만 오류는 발생하지 않습니다. 나는 나의 질문을 더 많은 예제로 업데이트했다 ... 나는 이것이 railo 버그인지 또는 Jsoup 버그인지 확신 할 수 없다. 두 그룹 모두 질문을 해봤지만 아무도 관심을 보이지 않습니다 ... – Tropicalista

+0

참조 : [Railo Discussion] (https://groups.google.com/forum/?fromgroups=#!topic/ railo/NvylfseXN6Y) 및 [Jsoup Discussion] (https://groups.google.com/forum/?fromgroups=#!topic/jsoup/edTpR8XtSFk)을 참조하십시오. –

답변

1

DOCTYPE이 유효하려면 문서의 첫 번째 것이어야하므로 인스턴스를 확인하는 노드를 반복 할 필요가 없습니다.

첫 번째 태그를 검사하기 만하면됩니다 - 그 (제 1 및 제 2 >의 사이에, 일부 XHTML 또는,), 최초의 > 문자 전에 HTML 문자열의 내용입니다 또한

당신을 전체 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

object.getClass().getName() EQ 'org.jsoup.Jsoup'을 테스트하여 클래스가 예상 한 결과인지 확인할 수 있습니다.

코드로 문제를 해결할 수 있지만 doctype을 결정하기 위해 게시 한 다른 답변을 계속 추천합니다.