Выберите Теги при разборе XML с помощью NSXML Parser Objective-C - PullRequest
0 голосов
/ 02 марта 2012

У меня работает мой xml-анализ, но я хочу получить одно значение, и фактически мой парсер прочитает и запишет их все в NSDictionnary

Позвольте мне показать вам

xml, о котором я говорюabout: XML

Как видите, основным тегом является «marche», есть 7 тегов «echeance».В каждом теге у нас есть 10 последних дат, и каждая «дата» содержит несколько значений.

На самом деле я хочу получить эти значения и ТОЛЬКО эти значения:

  • Для КАЖДОГО "echeance"", выберите атрибут" nom "для тегов" echeance "И" урегулирования "и изменения самой последней даты (для каждого echeance).

Вот что я получил в результате:

2012-03-02 20:04:08.576 XML[4497:f803] stories :(
    {
    echeance = "Mars 2012\n    ";
    settle = "205.25\n      205.5\n      206\n      205\n      202.75\n      204\n      204.75\n      206.5\n      206.25\n      210\n      ";
    variation = "-0.25\n    \n    -0.5\n    \n    1\n    \n    2.25\n    \n    -1.25\n    \n    -0.75\n    \n    -1.75\n    \n    0.25\n    \n    -3.75\n    \n    1.5\n    \n    ";
},
    {
    echeance = "Juin 2012\n    ";
    settle = "207.75\n      207.5\n      207.25\n      206\n      204.75\n      205.5\n      206.25\n      207.25\n      206.5\n      210.5\n      ";
    variation = "0.25\n    \n    0.25\n    \n    1.25\n    \n    1.25\n    \n    -0.75\n    \n    -0.75\n    \n    -1\n    \n    0.75\n    \n    -4\n    \n    0.75\n    \n    ";
},
    {
    echeance = "Ao\U00fbt 2012\n    ";
    settle = "209.75\n      209.25\n      208.5\n      207.25\n      205.75\n      207.25\n      207.75\n      208.75\n      208.5\n      211.75\n      ";
    variation = "0.5\n    \n    0.75\n    \n    1.25\n    \n    1.5\n    \n    -1.5\n    \n    -0.5\n    \n    -1\n    \n    0.25\n    \n    -3.25\n    \n    0.25\n    \n    ";
},
    {
    echeance = "Novembre 2012\n    ";
    settle = "188.25\n      188\n      186.75\n      186.25\n      184.75\n      184.75\n      186.5\n      186\n      185\n      188.5\n      ";
    variation = "0.25\n    \n    1.25\n    \n    0.5\n    \n    1.5\n    \n    0\n    \n    -1.75\n    \n    0.5\n    \n    1\n    \n    -3.5\n    \n    1\n    \n    ";
},
    {
    echeance = "Janvier 2013\n    ";
    settle = "189.75\n      189\n      189.5\n      188.75\n      187.25\n      187.25\n      188.5\n      188.5\n      187.5\n      190\n      ";
    variation = "0.75\n    \n    -0.5\n    \n    0.75\n    \n    1.5\n    \n    0\n    \n    -1.25\n    \n    0\n    \n    1\n    \n    -2.5\n    \n    0\n    \n    ";
},
    {
    echeance = "Mars 2013\n    ";
    settle = "191\n      191\n      191.5\n      190.75\n      189.25\n      189.25\n      190.5\n      190.5\n      189.5\n      192\n      ";
    variation = "0\n    \n    -0.5\n    \n    0.75\n    \n    1.5\n    \n    0\n    \n    -1.25\n    \n    0\n    \n    1\n    \n    -2.5\n    \n    1\n    \n    ";
},
    {
    echeance = "Juin 2013\n    ";
    settle = "194.5\n      194.5\n      195.5\n      194.75\n      193.25\n      193.25\n      194.5\n      194.5\n      193.5\n      196\n      ";
    variation = "0\n    \n    -1\n    \n    0.75\n    \n    1.5\n    \n    0\n    \n    -1.25\n    \n    0\n    \n    1\n    \n    -2.5\n    \n    3\n    \n    ";
}

)

Как вы можете видеть, у меня есть прекрасные NSDictionnary "истории" с каждым "nom" из "echeance НО" для "урегулирования" и "вариации", у меня есть значениядля ВСЕХ дат каждого "echeance", а не ТОЛЬКО САМЫХ ПОСЛЕДНИХ.

Если мой парсер будет работать, у меня должно быть что-то вроде этого:

2012-03-02 20:04:08.576 XML[4497:f803] stories :(
    {
    echeance = "Mars 2012";
    settle = "205.25"
    variation = "-0.25"
},
    {
    echeance = "Juin 2012";
    settle = "207.75"
    variation = "0.25"

.......... .....
ETC ...

Вот мой код:

Моя .m модель:

    #import "XMLParser.h"

@implementation XMLParser

@synthesize stories;
@synthesize delegate;

- (void)parseXMLAtURL:(NSURL*)path 

{
    stories = [[NSMutableArray alloc] init];

    textParser = [[NSXMLParser alloc] initWithContentsOfURL:path];

    [textParser setDelegate:self];

    [textParser parse];

}


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

}

- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError 

{
    NSString * errorString = [NSString stringWithFormat:@"Impossible de parser le document (Code erreur %i )", [parseError code]];

    NSLog(@"erreur de parsing XML: %@", errorString);

    UIAlertView * errorAlert = [[UIAlertView alloc] initWithTitle:@"Erreur lors du chargement" message:errorString delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];

    [errorAlert show];
    [errorAlert release];

}

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
    if(currentElement)
    {
        [currentElement release];
        currentElement = nil;
    }
    currentElement = [elementName copy];

    if ([elementName isEqualToString:kExpiry]) 

    {

        if(item)
        {
            [item release];
            item = nil;
        }
        if(currentExpiry)
        {
            [currentExpiry release];
            currentExpiry = nil;
        }
        if(currentSettle)
        {   
            [currentSettle release];
            currentSettle = nil;
        }
        if(currentVariation)
        {
            [currentVariation release];
            currentVariation = nil;
        }

        item = [[NSMutableDictionary alloc] init];
        currentVariation = [[NSMutableString alloc] init];
        currentSettle = [[NSMutableString alloc] init];
        currentExpiry = [[NSMutableString alloc] initWithFormat:[attributeDict objectForKey:@"nom"]];


    }
}

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

{
    if ([elementName isEqualToString:kExpiry]) 

    {
        [item setObject:currentExpiry forKey:kExpiry];
        [item setObject:currentSettle forKey:kCloture];
        [item setObject:currentVariation forKey:kChange];

        [stories addObject:item];

    }   
    //NSLog(@"compteur : %i",compteur);

}

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

{

    // on sauve les éléments de l' echeancepour l'item en cours
    if ([currentElement isEqualToString:kCloture])
        [currentSettle appendString:string];
    else if ([currentElement isEqualToString:kExpiry])
        [currentExpiry appendString:string];
    else if ([currentElement isEqualToString:kChange])
        [currentVariation appendString:string];
}

- (void)parserDidEndDocument:(NSXMLParser *)parser 

{

    NSLog(@"C’est fini !");
    NSLog(@"stories a %d echeances", [stories count]);
    NSLog(@"stories :%@", stories);
    [self performSelectorOnMainThread:@selector(tellTheDelegateItIsFinished) withObject:nil waitUntilDone:NO];
}

- (void) tellTheDelegateItIsFinished {
    [delegate xmlParserdidFinishParsing];   
}

- (void) dealloc 

{
    [stories release];
    [textParser release];
    [item release];
    [currentVariation release];
    [currentExpiry release];
    [currentSettle release];

    [super dealloc];

}
@end

Полагаю, мне нужно "посчитать" и выбрать только то значение, которое мне нужно, но оно не работает

Другая проблема, с которой я столкнулся, это "\ n". Я не могу этого избежать"\ n" :( Но тОсновная проблема заключается в подборе «хороших ценностей»;)

Спасибо всем

1 Ответ

0 голосов
/ 02 марта 2012

Мне кажется, что проблема может заключаться в том, что вы не прекращаете анализ в своей реализации didEndElement.У вас есть строка if ([elementName isEqualToString:kExpiry]), поэтому вы получаете только одну дату.Но вы не делаете это для «урегулирования» и «изменения», поэтому вы получаете все из них.Вы добавляете их в словарь и добавляете словарь в массив, но это всего лишь указатели, поэтому данные продолжают поступать и добавляются к ним - внутри словаря внутри массива.

...