Разобрать документы XML и создать массив с некоторыми значениями XML - PullRequest
0 голосов
/ 27 февраля 2012

Прежде всего, пожалуйста, примите мои извинения за текст.Я француз, и это не было бы "странно", в моем синтаксисе есть некоторые ошибки.

Имейте в виду, я тоже "новичок" в объективном мире C и программировании.

Итак, чтобы объяснить вам проблему, в которой я на самом деле, мне нужно проанализировать xml, взять из него некоторую информацию (поместить ее в массив или словарь) и отобразить ее в виде.

этовид XML, который мне нужно проанализировать: XML

Итак, как вы можете видеть, в этом XML есть несколько тегов "echeances".В них у вас есть предыдущие десять дат, а в этих датах у вас есть разные значения.

Что я должен отобразить в конце?Теги «Расчет» и «Вариация» ближайшей даты (первая в «списке») для КАЖДОГО тега «echeance».(Мне также нужно подобрать Атрибут "nom =" для каждого "echeance".

На самом деле я научился использовать кодирование "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

И, как вы можете сделать ставку на это ... Это не работает.

То, что я действительно хочусделать, это сделать словарь с атрибутом "nom =" из тега "echeance" как КЛЮЧ моего словаря, и каждый ключ связан с правильным урегулированием и вариацией, как объяснено в верхней части моей темы.Я хотел бы поблагодарить всех людей, которые попытаются помочь мне:)

Спасибо за чтение.

Romain

1 Ответ

0 голосов
/ 27 февраля 2012

Принцип NSXMLParserDelegate состоит в комбинации didStartElement (), foundCharacters () и didEndElement ():

Echaence-Object имеет:

  • nom
  • rangeArray как изменяемый массив

parseXMLAtUrl:

  • Создать объект словаря

didStartElement:

  • Найденоelement 'echeance' => создать новый объект Echeance и сохранить его в словаре.Сохраните указатель на объект для дальнейших действий в закрытом свойстве.
  • найденный элемент 'урегулирование' => флаг хранилища, мы находимся в режиме урегулирования

foundCharacters:

  • if intain_mode => добавить строку к текущему объекту Echeance-ObjectrangeArray

didEndElement:

  • найденный элемент 'урегулировать' => удалить флаг, мы 'в режиме урегулирования
...