XML 解析并将变量设置为实例

XML Parsing and set variables to instance

提问人:Michael Md Di Pietro 提问时间:10/18/2014 最后编辑:CœurMichael Md Di Pietro 更新时间:7/16/2017 访问量:87

问:

我创建了一个名为“event”的类。此类有三个变量。

主文件初始化此类的实例,在我解析 xml 文件后,但当我去检索创建的实例时,我无法识别。

我哪里错了?

#import "mkViewController.h"
#import "evento.h"

@interface mkViewController ()    
@end

@implementation mkViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSURL *url = [NSURL URLWithString:@"http://xxxxx.it/xxx.xml"];
    parser = [[NSXMLParser alloc] initWithContentsOfURL:url];

    [parser setDelegate:self];
    [parser setShouldResolveExternalEntities:NO];
    [parser parse];

    NSMutableArray *datiEvento = [NSMutableArray array];
    evento *eventoTrovato = [[evento init]alloc];
}

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict 
{        
    element = elementName;

    if ([element isEqualToString:@"evento"]) {        
        // Create la array dell'evento
        eventoTrovato.nome = string;  **<--- not found eventoTrovato instace**
    }    
}
iOS Objective-C XCODE NSXMLPasererrordomain

评论


答:

0赞 kabarga 10/18/2014 #1

您在 viewDidLoad 中仅创建了局部变量 eventoTrovato。如果你不仅想在一个方法中使用它,那么你必须在你的类中定义变量或属性,比如:

@interface mkViewController ()    
@property (nonatomic, strong) evento *eventoTrovato;
@end

.....

- (void)viewDidLoad
{
    ....... 
    self.eventoTrovato = [evento new];
}

- (void)parser.........
{            
     .......
     _eventoTrovato.nome = string;  
}

另一件事是,如果你想将许多元素存储到数组中。代码如下所示:

@interface mkViewController ()    
@property (nonatomic, strong) NSMutableArray *datiEvento;
@end

- (void)viewDidLoad
{
    ....... 
    self.datiEvento = [NSMutableArray array];
}

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict 
{        
    element = elementName;

    if ([element isEqualToString:@"evento"]) {  
        evento *eventoTrovato = [evento new];      
        eventoTrovato.nome = string;

        [self.datiEvento addObject:eventoTrovato];
    }    
}

评论

0赞 Michael Md Di Pietro 10/18/2014
非常感谢您的回答,但是每当它找到一个元素时这样做并不总是覆盖相同的实例?如果 volesi 对于找到的每个元素,我都会创建一个新的事件对象,并在数组中将其添加到最后?
0赞 Michael Md Di Pietro 10/18/2014
但感谢 eventoTrovato * 对象没有被覆盖 cn 总是发现新数据?当我在调用后去添加数组时,我没有发现很多元素都相等?
0赞 kabarga 10/18/2014
它是本地实例,因此您可以创建一个,设置字符串并添加到数组中并将其保留在那里。下次再添加一个...如果找不到任何内容,则 [self.datiEvento count] 将为 0。如果你能找到 5,那么 [self.datiEvento count] == 5。5 元素 isKindOfClass evento