2010-03-20 8 views
1

Comment obtenez-vous un DOMDocument d'une chaîne HTML donnée en utilisant WebKit? En d'autres termes, quelle est la mise en œuvre DOMDocumentFromHTML: quelque chose comme ce qui suit:WebKit & Objective-C: comment analyser une chaîne HTML dans un DOMDocument?

NSString * htmlString = @"<html><body><p>Test</body></html>"; 
DOMDocument * document = [self DOMDocumentFromHTML: htmlString]; 

DOMNode * bodyNode = [[document getElementsByTagName: @"body"] item: 0]; 
// ... etc. 

Cela semble comme il devrait être facile de le faire, mais je suis encore de la difficulté à trouver comment :(...

+0

Si vos questions précédentes sont résolues, utilisez la coche pour accepter la réponse la plus utile. N'oubliez pas de voter sur des réponses utiles. Lisez la FAQ pour plus de détails. –

+0

N'avait pas réalisé que je devrais choisir une réponse "le résout"; Merci d'avoir fait remarquer cela! – Rinzwind

Répondre

4

Pas une réponse réelle à la question, mais j'ai maintenant conclu que WebKit et DOMDocument ne sont probablement pas les outils les plus appropriés pour ce que je veux faire; qui est de traiter un document HTML qui n'est pas montré à l'utilisateur. La classe NSXMLDocument et prend en charge de façon synchrone carrément transformer un document HTML dans une structure d'objet manipulable:

NSError * error = nil; 
NSString * htmlString = @"<html><body><p>Test</body></html>"; 

NSXMLDocument * doc = 
    [[NSXMLDocument alloc] 
    initWithXMLString: htmlString 
    options: NSXMLDocumentTidyHTML 
    error: &error]; 
NSLog(@"Error is: %@", error); 
NSLog(@"Doc is: %@", doc); 
NSLog(@"Root element is: %@", [doc rootElement]); 
NSLog(@"Root element's children are: %@", [[doc rootElement] children]); 
1

d'après ce que je peux tirer de another answer on this site, il n'y a pas de méthode synchrone telle que ma demande DOMDocumentFromHTML: disponible dans WebKit.

jusqu'à présent, le meilleur que je suis en mesure de faire est la combinaison asynchrone suivante de giveDOMDocumentFromHTML:usingBaseURL: et takeDOMDocument:.

- (void) giveDOMDocumentFromHTML: (NSString *) htmlString 
     usingBaseURL: (NSURL *) baseURL 
{ 
    WebView * webView = [[WebView alloc] init]; 
    [webView setFrameLoadDelegate: self]; 
    [[webView mainFrame] loadHTMLString: htmlString 
         baseURL: baseURL]; 
} 

- (void) takeDOMDocument: (DOMDocument *) document 
{ 
    DOMHTMLElement * bodyNode = 
     (DOMHTMLElement *) [[document getElementsByTagName: @"body"] item: 0]; 
    NSLog(@"Body is: %@", [bodyNode innerHTML]); 
} 

Ils sont accrochés ensemble par la méthode déléguée suivante:

- (void) webView: (WebView *) webView 
     didFinishLoadForFrame: (WebFrame *) frame 
{ 
    if (frame == [webView mainFrame]) { 
     [self takeDOMDocument: [frame DOMDocument]]; 
    } 
} 

Les travaux ci-dessus, mais il a au moins les questions en suspens suivantes:

  • Je ne sais pas où le WebView alloué doit recevoir un message release ou .
  • Je préférerais que l'application reste bloquée jusqu'à ce que la page HTML ait été traitée. Dans le schéma ci-dessus, l'application traitera toute entrée utilisateur pendant que WebView charge/analyse le code HTML. (Notez que le WebView ne s'affichera jamais à l'écran.)

Il est donc encore beaucoup à améliorer. Toute personne pouvant fournir une implémentation synchrone pour DOMDocumentFromHTML: comme indiqué dans la question d'origine?