2011年1月16日日曜日

XcodeでMacRuby・6日目 NSXMLDocument

rssリーダーの続き。
- (void)windowControllerDidLoadNib:(NSWindowController *) aController {
 [super windowControllerDidLoadNib:aController];
 // 書類のURLを取得します
 NSURL* fileURL; fileURL = [self fileURL]; if (!fileURL) {
  return;
 }
 // テキストファイルを読み込みます
 NSData* data; data = [NSData dataWithContentsOfURL:fileURL]; 
 // XMLドキュメントを作成します
 xmlDocument = [[NSXMLDocument alloc] initWithContentsOfURL:fileURL options:0 error:NULL];
 if (!xmlDocument) {
   return;
 }
 // '/rss/channle/title'のノードを取得します
 NSArray* nodes; nodes = [xmlDocument nodesForXPath:@"/rss/channel/title" error:NULL]; 
 if ([nodes count] == 1) {
  NSXMLNode* titleNode; titleNode = [nodes objectAtIndex:0];
  // テキストフィールドにタイトルを設定します
  NSString* title; title = [titleNode stringValue]; [titleTextField setStringValue:title];
 }
 // '/rss/channle/link'のノードを取得します
 nodes = [xmlDocument nodesForXPath:@"/rss/channel/link" error:NULL]; if ([nodes count] == 1) {
  NSXMLNode* linkNode; linkNode = [nodes objectAtIndex:0];
 // テキストフィールドにリンクを設定します
  NSString* link; link = [linkNode stringValue]; [linkTextField setStringValue:link];
 }
}

これをこう書きなおしたら意図通り動きました。

def windowControllerDidLoadNib(aController)
    super
    fileURL ? super : return
  
    data=NSData.dataWithContentsOfURL(fileURL)
    @xmlDocument = NSXMLDocument.alloc.initWithData(data, options:NSXMLDocumentTidyXML, error:nil)

    return unless @xmlDocument 
  
    nodes=[]
    nodes=@xmlDocument.nodesForXPath("/rss/channel/title", error:nil)
    if nodes.count==1 then
      titleNode=nodes.objectAtIndex(0)   
      title=titleNode.stringValue
      titleTextField.setStringValue title
    end
    nodes=@xmlDocument.nodesForXPath("/rss/channel/link", error:nil)
    if nodes.count==1 then
      linkNode=nodes.objectAtIndex(0)
      link=linkNode.stringValue
      linkTextField.setStringValue link
    end
end

cocoaのプログラムの作る、というだけなら素直にObjC使ったほうが簡単でしょうね。(^^;)わざわざrubyに書き換えているのはrubyの勉強だから、です。ついでにcocoaの勉強もできるんだから一挙両得。

今回なかなかわからなかったのは
xmlDocument = [[NSXMLDocument alloc] initWithContentsOfURL:fileURL options:0 error:NULL];

これをどうするか、でした。初めは
@xmlDocument = NSXMLDocument.alloc.initWithData(data, "xml", nil)
と書いてみたんですが、こうやるとNSXMLDocumentにそんなメソッドはない、と怒られてしまう。そんでいつもの
MacRuby: The Definitive Guide

のなかを検索したら、やっぱりありました。うーん、この本は買いだな。まだアルファ版くらいだけど。

document = NSXMLDocument.alloc.initWithData(data, options:NSXMLDocumentTidyHTML, error:nil)

そうか、こうやってオプションとかを書くのか・・・。TidyHTMLをTidyXMLにしたらすっきり動くようになりました。完全な自己満足の世界ではありますが、とってもおもしろいですねえ。

0 件のコメント:

コメントを投稿