Циклы синтаксического анализа NSXML 3 раза на 1 узле

#iphone #objective-c #ios #nsxmlparser

#iPhone #objective-c #iOS #nsxmlparser

Вопрос:

Я использую 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 раза по узлу created_time. Любая помощь была бы отличной!

Комментарии:

1. замените currentElement = [Копия имяэлемЕнта]; на currentElement=имяэлемЕнта;

2. Хорошо, к сожалению, это не приводит к каким-либо изменениям. Все тот же журнал.

3. используйте NSLog(@»%@»,currentElement); после currentElement=[Копия имяэлемента]; и посмотрите, правильно ли он печатает currentElement.

Ответ №1:

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

    - (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);}
        }