xpath仕様 を使用しています XPathはじめに
HTMLをURLからNSXMLDocumentに渡し、 NSXMLNodeの nodesForXPath:errorで必要な値を取得します。
この場合、メインフレームのURLを使用します。ただし、有効なURLであれば問題ありません。
どちらのNSXMLクラスも、xmlと同じようにhtmlの解析に問題がないようです。
検索できるxpathクエリ文字列構文の例はたくさんあります。HTMLタグとクラス構文がわかれば、DOMツリーにドリルダウンするのは非常に簡単です。
ここでは、ページ全体に対して非常に単純なhrefクエリを使用しました。
ただし、コメントアウトした例を含めて、もう少し詳しく説明します。
-(void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
[theWebView setFrameLoadDelegate:self];
NSURL* fileURL = [NSURL URLWithString:@"http://example.com"];
NSURLRequest* request = [NSURLRequest requestWithURL:fileURL];
[[theWebView mainFrame] loadRequest:request];
}
-(void)webView:(WebView *)sender didFinishLoadForFrame:(WebFrame *)frame {
NSError *err_p = nil;
NSXMLDocument * xmlDoc = [[NSXMLDocument alloc] initWithContentsOfURL:[NSURL URLWithString:[theWebView mainFrameURL]]
options:(NSXMLNodePreserveWhitespace|
NSXMLNodePreserveCDATA)
error:&err_p];
if (xmlDoc == nil) {
xmlDoc = [[NSXMLDocument alloc] initWithContentsOfURL:[NSURL URLWithString:[theWebView mainFrameURL]]
options:NSXMLDocumentTidyXML
error:&err_p];
}
NSError * error2;
NSString *xpathQueryTRTest =@"//a";//--query string for all <a href tags
//-- for example 2 --NSString *xpathQueryTRTest =@"//div/p[1]";//--query string for all <a href tags
NSArray *newItemsNodesTRTEST = [xmlDoc nodesForXPath:xpathQueryTRTest error:&error2];//--xpath node results returned in an array
[xmlDoc release];
if (error2)
{
[[NSAlert alertWithError:error2] runModal];
return ;
}
for (NSXMLElement *node in newItemsNodesTRTEST)//--parse the nodes in the array
{
NSLog(@"\nThe Node = %@\nThe node href value = %@", node, [[node attributeForName:@"href"]stringValue]);
//--for example 2 -- NSLog(@"\nThe Node value = %@\n", [node stringValue]);
}
}