NSXML анализирует циклы 3 раза по 1 узлу - PullRequest
0 голосов
/ 10 июня 2011

Я использую NSXMLParser для разбора файла XML.Я делаю это несколько раз в моем приложении для разных целей.У меня есть один, который анализирует аннотации для локатора магазина, один, который анализирует все фильмы с определенного канала YouTube, а последний анализирует самодельный файл XML.

Все парсеры работают отлично, кроме последнего.По какой-то причине он анализирует, т.е. первый узел исправен, но затем перезаписывает его.

Вот мой код парсера:

    //Standard function parser: reading open tag
    - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName
      namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
        attributes:(NSDictionary *)attributeDict{ 
        currentElement = [elementName copy];
        if ([elementName isEqualToString:@"item"]) {
            xmlArray = [[NSMutableDictionary alloc] init];
        }

    }


    //Standard function parser: reading string
    - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
        if ([currentElement isEqualToString:@"created_time"]){
            [xmlArray setObject:string forKey:currentElement]; 
            NSLog(@"test 1 %@", string);}
    }    


    //Standard function parser: reading close tag
    - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName
      namespaceURI:(NSString *)namespaceURI
     qualifiedName:(NSString *)qName{ 
        if ([elementName isEqualToString:@"item"]) {
            Post *newPost = [[Post alloc] init];
            NSLog(@"test %@", xmlArray );
            newPost.created_time = [xmlArray objectForKey:@"created_time"];
            [containerArray addObject:newPost];
            [xmlArray release];


 }
}  

XML выглядит следующим образом:

<?xml version="1.0" encoding="UTF-8" ?> 
<items>
<item> 
<created_time>test</created_time> 
<message>blabla</message> 
<picture>http://www.trentshow.com/images/tada.jpg</picture> 
</item>
</items>

И журнал выдает следующее:

2011-06-10 10:43:24.446 TabbedCalculation[1502:207] test 1 test
2011-06-10 10:43:24.448 TabbedCalculation[1502:207] test 1  
2011-06-10 10:43:24.449 TabbedCalculation[1502:207] test 1 
2011-06-10 10:43:24.450 TabbedCalculation[1502:207] test {
    "created_time" = "\n";
}

Я не понимаю, почему анализатор зацикливается 3 раза на узле созданного времени.Любая помощь будет отличной!

1 Ответ

1 голос
/ 10 июня 2011

Попробуйте по следующему решению - должно работать. foundCharacters может вызываться несколько раз для каждого значения ключа - в основном вы должны добавить список всех найденных символов.

   - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
            if ([currentElement isEqualToString:@"created_time"]){
                NSString *valueKey = [xmlArray ValueForKey:forKey:currentElement];
                if(nil != valueKey) 
                {
                   valueKey = [valueKey stringByAppendingString:string];
                }else
                {
                   valueKey = string;
                }
                [xmlArray setObject:valueKey forKey:currentElement]; 
                NSLog(@"test 1 %@", string);}
        } 
...