- (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 件のコメント:
コメントを投稿