- (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 endcocoaのプログラムの作る、というだけなら素直に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 件のコメント:
コメントを投稿