2011-03-10 89 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