解析Xml文档并使用一些Xml的值创建一个Array

时间:2012-02-26 21:29:26

标签: objective-c nsxmlparser

首先,请接受我对案文的道歉。我是法国人,我的语法中有一些错误并不会“奇怪”。

请记住,我是客观C世界和编程的“新手”。

因此,为了解释我实际存在的问题,我需要解析一个xml,从中获取一些信息,(将它们放在数组或字典中)并在视图上显示它们。

这是我必须解析的那种Xml:XML

正如你所看到的,你在这个Xml中有几个“echeances”标签。在他们中你有前十个日期,在那些日期,你有不同的值。

我最后要展示什么?每个“echeance”标签的最近日期(“列表”中的第一个)的标签“Settle”和“Variation”。 (我还需要为每个“echeance”获取属性“nom =”。

实际上我已经学会了使用“MVC”编码,而且我对“模型”部分有一些麻烦。

我使用Xcode 4.2并使用(我尝试...)来使用ARC模式。

让我看看我现在所做的事情

.h:

#import <Foundation/Foundation.h>
#import "Echeances.h"

@interface XMLToObjectParser : NSObject <NSXMLParserDelegate> 

{
    NSMutableString *settle;
    NSMutableString *settle2;
    NSMutableString *change;
    NSMutableArray *lstEcheance;   
    NSString *currentNodeName;
    NSMutableString *currentNodeContent;
    NSMutableDictionary *dico;
    NSMutableArray *settleArray;
    NSMutableArray *expiryArray;
    NSMutableArray *changeArray;
    NSString *expiryName;
    int compteur;
    Echeance *ech;
}

@property (nonatomic, strong) NSMutableArray *expiryArray;
@property (nonatomic, strong) NSMutableArray *settleArray;
@property (nonatomic, strong) NSMutableArray *changeArray;
@property (nonatomic, strong) NSMutableString *currentNodeContent;
@property (nonatomic, strong) Echeance *ech;
@property (nonatomic, strong) NSString *expiryName;
@property (nonatomic, strong) NSMutableString *settle;
@property (nonatomic, strong) NSMutableString *settle2;
@property (nonatomic, strong) NSMutableString *change;





- (NSMutableArray *)expiry;

- (id)parseXMLAtURL:(NSURL *)url toObject:(NSString *)echeance parseError:(NSError **)error;


@end

.m:

#import "XMLToObjectParser.h"


@implementation XMLToObjectParser

@synthesize expiryArray;
@synthesize settleArray;
@synthesize changeArray;
@synthesize currentNodeContent;
@synthesize ech;
@synthesize expiryName;
@synthesize settle;
@synthesize settle2;
@synthesize change;


- (NSMutableArray *)expiry

{
    return expiryArray;

}

- (NSMutableDictionary *)dico

{
    return dico;
}

- (id)parseXMLAtURL:(NSURL *)url toObject:(NSString *)aExpiryName parseError:(NSError **)error
{

    NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:url];

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


    if([parser parserError] && error) 
    {
        *error = [parser parserError];
    }

    return self;
}

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


{

    if([elementName isEqualToString:@"echeance"]) 

    {

        ech.nomEcheance = [attributeDict objectForKey:@"nom"];

        [expiryArray addObject:ech.nomEcheance];

        NSLog(@"%@", expiryArray);

    }


}   

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName

{

    if([elementName isEqualToString:@"settle"] || [elementName isEqualToString:@"variation"]) 

    {

        for(int i = 0; i < [expiryArray count]; i++)
        {
            [settleArray addObject:currentNodeContent];
            NSLog(@"settle Array: %@",[settleArray lastObject]);
        }


    }


}


- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string

{   

    [currentNodeContent setString:string];

}



@end

正如你可以赌它...它不起作用。

我真正想做的事情就是用“echeance”标签的“nom =”作为我的词典的关键词来制作一个词典,并将每个关键词与正确的解决方案和变异相关联,作为我的主题上的解释。

要完成,我要感谢所有试图帮助我的人:)

感谢阅读。

罗曼

1 个答案:

答案 0 :(得分:0)

NSXMLParserDelegate的原理是didStartElement(),foundCharacters()和didEndElement()的组合:

Echaence-Object有:

  • nom
  • settleArray作为一个可变阵列

parseXMLAtUrl:

  • 创建字典对象

didStartElement:

  • 找到元素'echeance'=&gt;创建新对象Echeance并将其存储在Dictionary中。保持指向对象的指针,以便在私有财产中进行进一步的操作。
  • 发现元素'结算'=&gt;商店旗帜,我们处于定居模式

foundCharacters:

  • 如果在sett_mode =&gt;将字符串添加到当前Echeance-Object的settleArray

didEndElement:

  • 发现元素'结算'=&gt;删除标志,我们处于结算模式