2013-02-23 3 views
0

Я запускаю Linux-сервер с tomcat и Railo. Если бы я попробовать этот простой код:Railo instanceof не работает с Jsoup

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

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

writeDump(check); 

Если я запускаю этот простой код вар check всегда пусто. Я запускаю этот простой тест со многими классами 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); 

Есть ли способ решить эту проблему? могу ли я использовать другой код, чтобы проверить, какой тип документа является документом?

Этот код отлично работает на моей локальной машине 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

Не могу понять, почему isInstanceOf не работает - особенно если он работает на одной установке, но не другой - можете ли вы [поднять ошибку] ​​(https://issues.jboss.org/browse/RAILO) с соответствующими Детали. –

+0

Я хотел бы поднять ошибку с соответствующими деталями, но добавить нечего. Я добавляю try/catch в свой код, чтобы узнать, что не так, но не получим ошибок. Я добавлю свой вопрос в следующем примере ... Я не могу быть уверен, что это ошибка жука или ошибка 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 был действительным, это должно быть первое, что нужно в документе, поэтому нет необходимости циклически проверять экземпляры узлов.

Все, что вам нужно сделать, это изучить первый тег - то есть, содержимое 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

Вы можете проверить object.getClass().getName() EQ 'org.jsoup.Jsoup', чтобы увидеть, если класс является то, что вы ожидаете.

Несмотря на то, что это решит проблему с вашим кодом, я по-прежнему рекомендую другой ответ, который я разместил для определения doctype.