2012-03-02 2 views
0

У меня есть синтаксический анализ XML работает, но я хочу, чтобы подобрать одно значение и на самом деле мой парсер читать и писать их все в NSDictionnaryВыберите теги при разборе XML с NSXML Parser Objective-C

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

XML, я имею в виду: XML

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

На самом деле, я хочу, чтобы получить эти значения и только те значения:

  • для каждого «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 «истории» с каждым «НОМ» в «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». Я не в состоянии избежать этих «\ п» :(Но главная проблема заключается в выборе из «хороших ценностей»;)

Спасибо за все

ответ

0

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

+0

Хммм хорошо! Что ты предлагаешь мне! (извините, я новичок в мире progrmation) – Romain

+0

Ну, я бы никогда не структурировал программу так, как у вас есть. Я бы создал реальные объекты, чтобы соответствовать характеру данных, и я бы проанализировал весь XML в этих объектах. У меня будет класс Marche и класс Echeance, а также класс Date и класс Graphe, и я проанализирую весь XML иерархически в структуру, соответствующую структуре XML.И я бы не стал разбирать XML с одним делегатом, как вы делаете; Я бы использовал стратегию с несколькими делегатами: https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/XMLParsing/Articles/UsingMultipleDelegates.html – matt

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