2009-05-04 10 views
2

Quelqu'un pourrait-il qui est familier avec webkit s'il vous plaît expliquer ou me diriger dans la bonne direction pour expliquer pourquoi le code suivant ne fonctionne pasAccès DOM Webkit Objectif C

Ce que je suis en train de faire est de charger une page, ont webkit l'analyser et simplement imprimer le titre.

Voici ce que j'ai:

#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; 
} 

La sortie est à la fois html et le titre sont vides

Merci d'avoir lu

Répondre

4

Il ne fonctionne pas parce que WebKit repose sur la RunLoop pour charger le contenu, même si c'est simplement du contenu statique.

Vous devez ajouter une boucle standard course tels que:

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

Et créer une classe personnalisée que vous définissez comme WebFrameLoadDelegate (webView.frameLoadDelegate = thatObject), et dans le rappel - (void)webView:(WebView *)sender didFinishLoadForFrame:(WebFrame *)frame vous devriez être en mesure d'accéder au DOM. De même, lorsque le chargement est terminé, positionnez le drapeau done sur OUI.

+0

frameLoadDelegate? –

0

Si vous voulez juste analyser le HTML, pourquoi ne pas utiliser un NSXMLDocument au lieu d'un WebView. Je crois que son initialiseur initWithContentsOfURL bloque jusqu'à ce que l'URL soit chargée. Et si cela ne fonctionne pas, essayez de créer une demande NSURLRequest pour l'URL, puis utilisez [NSURLConnection sendSynchronousRequest: ..] pour le charger, puis le transmettre à NSXMLDocument.