【问题标题】:WebKit & Objective-C: how to parse a HTML string into a DOMDocument?WebKit 和 Objective-C:如何将 HTML 字符串解析为 DOMDocument?
【发布时间】:2010-03-20 14:54:01
【问题描述】:

如何使用 WebKit 从给定的 HTML 字符串中获取 DOMDocument?换句话说,DOMDocumentFromHTML: 的实现如下:

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

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

这似乎应该很简单,但我仍然无法弄清楚如何:( ...

【问题讨论】:

  • 如果您之前的问题得到解决,请使用复选标记接受最有帮助的答案。也不要忘记对有用的答案进行投票。阅读常见问题解答了解更多详情。
  • 没有意识到我应该选择一个“解决它”的答案;感谢您指出这一点!

标签: html objective-c webkit domdocument


【解决方案1】:

不是这个问题的实际答案,但我现在得出结论,WebKit 和 DOMDocument 可能不是我想做的最合适的工具;这是处理一个不向用户显示的 HTML 文档。 NSXMLDocument 类直接同步支持将 HTML 文档转换为可操作的对象结构:

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]);

【讨论】:

    【解决方案2】:

    根据我可以从another answer on this site 得到的信息,WebKit 中没有像我请求的DOMDocumentFromHTML: 这样的同步方法。

    到目前为止,我能做的最好的事情是giveDOMDocumentFromHTML:usingBaseURL: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]);
    }
    

    它们通过以下委托方法挂钩:

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

    上述方法可行,但至少还有以下问题:

    • 我不确定分配的 WebView 应该在哪里发送 releaseautorelease 消息。
    • 我希望/需要该应用程序在 HTML 页面被处理之前保持阻塞状态。在上述方案中,应用程序将在 WebView 加载/解析 HTML 时处理任何用户输入。 (请注意,WebView 永远不会显示在屏幕上。)

    所以这仍然有待改进。如原始问题中所述,谁能为DOMDocumentFromHTML: 提供同步实现?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-27
      • 1970-01-01
      • 2011-04-08
      相关资源
      最近更新 更多