2

Webkitに精通している人が、次のコードが機能しない理由について説明するか、正しい方向に向けてください。

私がやろうとしているのは、ページをロードし、Webkitに解析させて、タイトルを印刷することです。

これが私が持っているものです:

#include <iostream>
#include <WebKit/WebKit.h>

using namespace std;

/*
 Seek Help
*/
int main (int argc, char * const argv[]) {      
    NSAutoreleasePool    *autoreleasepool = [[NSAutoreleasePool alloc] init];

     WebFrame * mainFrame;
     WebView * view = [[WebView alloc] initWithFrame: NSMakeRect (0,0,640,480)];

    mainFrame = [view mainFrame];
    NSString * url = @"http://test.com";
    [[view mainFrame] loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:url]]];

    NSString * data = @"<html><head><title>testing</title></head><body>tester</body></html>";
    [[view mainFrame] loadHTMLString:data baseURL: nil];

    // NSString * urlString = [[NSString alloc] initWithUTF8String:"<html><head><title>Hello World</title></head><body><p>My first Web page.</p></body></html>"];

    //[[view mainFrame] loadHTMLString:urlString baseURL:nil];    

    NSString * outerHtml = [(DOMHTMLElement *)[[[view mainFrame] DOMDocument] documentElement] innerHTML];

     cout << "Html: " << [outerHtml UTF8String] << endl;

    NSString * title = [view mainFrameTitle];

    cout << "title: " << [title UTF8String] << endl;

    [autoreleasepool release];

     return 0;
}

出力はhtmlであり、タイトルは空白です

読んでくれてありがとう

4

2 に答える 2

4

WebKitはRunLoopに依存してコンテンツをロードするため、静的コンテンツであっても機能しません。

次のような標準の実行ループを追加する必要があります。

while (!done) {
    pool = [[NSAutoreleasePool alloc] init];
    [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode
                             beforeDate:[NSDate distantPast]];
    [pool release];
}

そして、WebFrameLoadDelegate(webView.frameLoadDelegate = thatObject)として設定したカスタムクラスを作成すると、- (void)webView:(WebView *)sender didFinishLoadForFrame:(WebFrame *)frameコールバックでDOMにアクセスできるようになります。また、ロードが完了したら、doneフラグをYESに設定します。

于 2009-05-05T12:07:35.167 に答える
0

HTMLを解析したいだけなら、WebViewの代わりにNSXMLDocumentを使用してみませんか。そのinitWithContentsOfURL初期化子は、URLがロードされるまでブロックすると思います。それでも問題が解決しない場合は、URLのNSURLRequestを作成してから、[NSURLConnection sendSynchronousRequest:..]を使用してロードし、NSXMLDocumentにフィードしてください。

于 2012-08-25T22:39:56.397 に答える