Приложение для чтения XML Cocoa - PullRequest
2 голосов
/ 10 марта 2011

Я новичок в Какао, просто разрабатываю небольшие приложения на 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 Ответ

1 голос
/ 11 марта 2011

Вы не слишком конкретны в отношении того, что не работает, но вот предположение или два в некоторых вещах, которые могут вызывать проблемы ...

Одна вещь, которую легко забыть, как новому пользователю 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
}
...