2016-08-31 2 views
0

У меня есть XML-файл с комментарием, у которого есть идентификатор в нижней части моего файла, который я успешно NSLog «ing» вышел на консоль. Я использовал NSXMLParser, чтобы найти комментарий с помощью метода foundComment. Затем у меня есть метод GetUID внизу, который я хочу вернуть строку uid. Я не уверен, как получить доступ к моим проанализированным данным и использовать их в другом отдельном методе. Любая помощь будет принята с благодарностью.Как я могу получить доступ к анализируемым XML-данным и использовать их другими способами?

XML FILE:

<audioTracks>0</audioTracks> 
<!--7934fad5a3a --> 

XMLParser.h

#import <Foundation/Foundation.h> 

@interface MyXmlParserDelegate : NSObject <NSXMLParserDelegate> 

@end 

XMLParser.mm

#import "XMLParser.h" 

@implementation MyXmlParserDelegate 

- (void) parserDidStartDocument:(NSXMLParser *)parser { 

} 

- (void)parser:(NSXMLParser *)parser 
foundComment:(NSString *)uid{ 

NSLog(@"UID: %@", uid); 

} 

- (void) parserDidEndDocument:(NSXMLParser *)parser { 

} 

@end 

MAIN.mm

-(NSString *)GetUID { 

     NSString * uid = nil; 

     NSXMLParser *parser = [[NSXMLParser alloc] initWithData:MyData]; 

     MyXmlParserDelegate *parserDelegate = [[MyXmlParserDelegate alloc] init]; 
     [parser setDelegate:parserDelegate]; 


     [parser parse]; 

    return uid; 

}

ответ

1

Лучший ответ зависит от того, как многократно использовать делегат-парсер.

Если объект MAIN является единственным клиентом, вы можете полностью исключить класс делегата, просто сделайте self делегатом, где вы выделите парсер в GetUID.

Более общая идея заключается в том, чтобы сохранить свой класс делегатов, и подумать об этом как о «uid finder». В этой форме он будет содержать публичное свойство uid, которое оно будет инициализировать во время сеанса. например

// in the delegate 
- (void)parser:(NSXMLParser *)parser foundComment:(NSString *)uid { 
    NSLog(@"UID: %@", uid); 
    self.uid = uid; 
} 

// in the customer 
MyXmlParserDelegate *parserDelegate = [[MyXmlParserDelegate alloc] init]; 
parser.delegate = parserDelegate; 
[parser parse]; 

EDIT

return parserDelegate.uid; 

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

Боковые заметки: Обычно названия классов и исходных файлов одинаковы, поэтому файл реализации MyXmlParserDelegate лучше называют «MyXmlParserDelegate.m». Кроме того, если ваши реализации не содержат C++, они должны иметь расширения «.m».

+0

Я попытался сделать то, что вы сказали, но на строке возвратить parse.uid, он выдает сообщение об ошибке «Свойство на uid не найдено по типу объекта NSXMLParser» – Nick

+0

Прошу прощения, что я очень новичок в объективе-C. Я чувствую, что это не должно быть так сложно назвать строку из другого метода. Ошибка все еще вызывает пень для меня. – Nick

+1

Мне это должно быть жаль. В моем предложенном коде была ошибка. См. Править. Делегат синтаксического анализа содержит новое свойство, а не синтаксический анализатор. – danh

Смежные вопросы