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:との非同期の組み合わせです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 をどこに送信するか、releaseまたはautoreleaseメッセージを送信する必要があるかわかりません。
  • HTML ページが処理されるまで、アプリケーションをブロックしたままにしたい/必要です。上記のスキームでは、WebView が HTML をロード/解析している間、アプリケーションはユーザー入力を処理します。(WebView は画面に表示されないことに注意してください。)

したがって、これはまだ改善の余地があります。DOMDocumentFromHTML:元の質問で概説したように、同期実装を提供できる人は誰ですか?

于 2010-03-20T21:21:30.960 に答える