Приложение для чтения XML Cocoa
Я новичок в Какао, просто разработаю несколько небольших приложений на C/C++ для Windows. Я хочу сделать "простое" приложение на Какао. Когда специфичный для пользователя XML-файл, файловые узлы представляются "просматриваемыми конечным пользователем".
Я сделал интерфейс с некоторым NSTextField. Я сделал подкласс NSDocument под названием "XMLFile", поэтому я получил "XMLFile.h" и "XMLFile.m" в своем проекте Xcode.
В списке своих приложений я установил новый "Типы документов": 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 анализирует файл для извлечения данных узлов и отправляет их в отличительный файл NSTextField. Но это не работает.
Если кто-то может мне помочь.
1 ответ
Вы не слишком конкретны в отношении того, что не работает, но вот несколько предположений о некоторых вещах, которые могут вызывать проблемы...
Как новый пользователь Cocoa, можно легко забыть, что IBOutlets должны быть подключены в Интерфейсном Разработчике. Удерживая клавишу Control, перетащите курсор из каждого текстового поля к Владельцу файла в вашем 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
}