0

Tomcat と Railo で Linux サーバーを実行しています。この単純なコードを試してみると:

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

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

writeDump(check );

この単純なコードを実行すると、varcheckは常に空になります。この単純なテストを多くの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";

4

2 に答える 2

1

object.getClass().getName() EQ 'org.jsoup.Jsoup'クラスが期待どおりかどうかをテストして確認できます。

これでコードの問題は解決しますが、Doctypeを決定するために投稿した他の回答をお勧めします。

于 2013-02-23T16:14:36.600 に答える
1

DOCTYPE が有効であるためには、それがドキュメントの最初のものでなければならないので、インスタンスをチェックするノードをループする必要はありません。

最初のタグ、つまり最初の文字の前の HTML 文字列の内容>(または、一部の XHTML の場合は最初と 2 番目>の s の間)を調べるだけです。

また、完全な 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 に答える