1

如何使用 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.

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

4

2 回答 2

4

不是这个问题的实际答案,但我现在得出结论,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]);
于 2010-03-20T21:52:25.167 回答
1

根据我可以从该站点上的另一个答案DOMDocumentFromHTML:中得出的信息,WebKit中没有我请求的同步方法。

到目前为止,我能做的最好的事情就是下面的giveDOMDocumentFromHTML:usingBaseURL:and的异步组合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:原始问题中概述的同步实现?

于 2010-03-20T21:21:30.960 回答