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