2011-03-10 69 views
2

我是Cocoa的新手,只是在Windows上用C/C++開發一些小應用程序。 我想在Cocoa上製作一個「簡單」應用程序。 當用戶特定的XML文件時,文件節點表示爲「enduser可見」。Cocoa XML閱讀器應用程序

我做了一些NSTextField的接口。 我做了一個名爲「XMLFile」的NSDocument的子類,所以我在我的Xcode項目中獲得了「XMLFile.h」和「XMLFile.m」。

在我的應用程序的plist中我成立了一個新的 「文件類型」: XML文件 - 擴展:XML - 角色:視圖 - 類:XMLFILE - 商鋪類型:XML

這是我的「XMLFILE。 H「:

#import <Cocoa/Cocoa.h> 


@interface FichierXML : NSDocument { 

} 

     IBOutlet NSTextField *dateField; 
     IBOutlet NSTextField *titleField; 
     IBOutlet NSTextField *descField; 
     IBOutlet NSTextField *vidfileField; 
     IBOutlet NSTextField *imgfileField; 
     IBOutlet NSObjectController *object; 
     NSUInteger *mask; 

@end 

這裏是我的 」XMLFile.m「:

#import "XMLFile.h" 

@implementation XMLFile 

- (BOOL)readFromData:(NSData *)datafile ofType:(NSString *)typeName error:(NSError **)outerror 

{ 

    NSMutableArray* ReportCreationDate = [[NSMutableArray alloc] initWithCapacity:10]; 
    NSMutableArray* ReportTitle = [[NSMutableArray alloc] initWithCapacity:10]; 
    NSMutableArray* ReportDescription = [[NSMutableArray alloc] initWithCapacity:10]; 
    NSMutableArray* VideoPath = [[NSMutableArray alloc] initWithCapacity:10]; 
    NSMutableArray* VideoThumbnailImageName = [[NSMutableArray alloc] initWithCapacity:10]; 

    NSXMLDocument* doc = [[NSXMLDocument alloc] initWithData:datafile options:mask error:outerror]; 
    NSXMLElement* root = [doc rootElement]; 
    NSArray* dateElement = [root nodesForXPath:@"//Report/ReportCreationDate" error:nil]; 
    for(NSXMLElement* xmlElement in dateElement) 
     [dateElement setStringValue:[xmlElement stringValue]]; 
    NSArray* titleElement = [root nodesForXPath:@"//Report/ReportTitle" error:nil]; 
    for(NSXMLElement* xmlElement in titleElement) 
     [titleField setStringValue:[xmlElement stringValue]]; 
    NSArray* descElement = [root nodesForXPath:@"//Report/ReportDescription" error:nil]; 
    for(NSXMLElement* xmlElement in descElement) 
     [descField setStringValue:[xmlElement stringValue]]; 
    NSArray* vidfileElement = [root nodesForXPath:@"//Report/Videos/Video/VideoPath" error:nil]; 
    for(NSXMLElement* xmlElement in vidfileElement) 
     [vidfileField setStringValue:[xmlElement stringValue]]; 
    NSArray* imgfileElement = [root nodesForXPath:@"//Report/Videos/Video/VideoThumbnailImageName" error:nil]; 
    for(NSXMLElement* xmlElement in imgfileElement) 
     [imgfileField setStringValue:[xmlElement stringValue]]; 

    [doc release]; 
    [ReportCreationDate release]; 
    [ReportTitle release]; 
    [ReportDescription release]; 
    [VideoPath release]; 
    [VideoThumbnailImageName release]; 

    return YES; 
} 

@end 

用戶打開XMLFILE,併爲XMLDocument分析文件中提取節點的數據並將其發送到d ifferents NSTextField。但它不起作用。

如果有人可以幫助我。

回答

1

你沒有太具體的什麼不行的,但這裏有一個猜測或兩個的一些事情,可能會造成麻煩......

一兩件事,可以很容易作爲一個新的可可忘記用戶是IBOutlets必須實際連接在Interface Builder中。控制 - 從每個文本字段拖到Document.xib中的文件所有者,並確保將它們分配到正確的插座。

另一個似乎很奇怪的項目(儘管我不知道它會導致問題)是使用for循環來設置文本字段的stringValue。如果每個元素的數組中有多個項目,則需要在設置文本字段的值之前自行連接字符串。反覆設置該值將簡單地擺脫先前的值。如果每個陣列中只有一個項目,爲什麼不能簡單地做:

NSArray *dateElement = [root 
       nodesForXPath:@"//Report/ReportCreationDate" 
         error:nil]; 
[dateField setStringValue: 
      [[dateElement objectAtIndex:0] stringValue]]; 

最後,你可能想嘗試確保有,當你查詢NSXMLDocument沒有錯誤:

NSError *dateErr; 
NSArray *dateElement = [root 
       nodesForXPath:@"//Report/ReportCreationDate" 
         error:&dateErr]; 
if(dateElement){ 
    // set the stringValue 
} 
else { 
    // inspect the error 
} 
+0

現在你有特權。 ;) – 2011-03-10 21:37:30

+0

@sudo rm -rf嗨,感謝您的支持! (雖然看起來我還是缺乏「評論無處不在」的代表) – 2011-03-10 21:47:34

+0

好了,以爲是20。我想這是50,哦。繼續! :d – 2011-03-10 21:54:51