Проблема NSXMLParser - пример SeismicXML - PullRequest
1 голос
/ 13 марта 2011

Эй, мне нужно разобрать XML в моем приложении для iOS.Я взял Apple SeismicXML Sample в качестве своей базы, но у меня действительно странное поведение.

Вот мои методы синтаксического анализа:

    - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName
                                    namespaceURI:(NSString *)namespaceURI
                                   qualifiedName:(NSString *)qName
                                      attributes:(NSDictionary *)attributeDict {

if ([elementName isEqualToString:kEntryElementName]) {
    Photo *photo = [[Photo alloc] init];
    self.currentPhotoObject = photo;
    [photo release];

} else if ([elementName isEqualToString:kTitleElementName] ||
       [elementName isEqualToString:kLocationElementName] ||
       [elementName isEqualToString:kAuthorElementName]) {

    accumulatingParsedCharacterData = YES;

    [currentParsedCharacterData setString:@""];
}

}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName
                                  namespaceURI:(NSString *)namespaceURI
                                 qualifiedName:(NSString *)qName {     
if ([elementName isEqualToString:kEntryElementName]) {
    NSLog(@"Did End - Titel:%@", self.currentPhotoObject.titleText);
    NSLog(@"Did End - Location:%@", self.currentPhotoObject.locationText);
    NSLog(@"Did End - Author:%@", self.currentPhotoObject.author);

    [self.currentParseBatch addObject:self.currentPhotoObject];

    parsedPhotosCounter++;
    if ([self.currentParseBatch count] >= kMaximumNumberOfPhotosToParse) {
        [self performSelectorOnMainThread:@selector(addPhotosToList:)
                               withObject:self.currentParseBatch
                            waitUntilDone:NO];
        self.currentParseBatch = [NSMutableArray array];
    }
}    

else if ([elementName isEqualToString:kTitleElementName]) {
    self.currentPhotoObject.titleText = self.currentParsedCharacterData;
} 

else if ([elementName isEqualToString:kAuthorElementName]) {
    self.currentPhotoObject.author = self.currentParsedCharacterData;

}

else if ([elementName isEqualToString:kLocationElementName]) {
    self.currentPhotoObject.locationText = self.currentParsedCharacterData;        
} 

accumulatingParsedCharacterData = NO;

}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
if (accumulatingParsedCharacterData) {
    // If the current element is one whose content we care about, append 'string'
    // to the property that holds the content of the current element.
    //
    [self.currentParsedCharacterData appendString:string];
}

}

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

 else if ([elementName isEqualToString:kTitleElementName]) {
    self.currentPhotoObject.titleText = self.currentParsedCharacterData;
} 

Когда я получаю «self.currentPhotoObject.titleText» через NSLog, я получаю правильные проанализированные данные.Но тогда:

else if ([elementName isEqualToString:kAuthorElementName]) {
    self.currentPhotoObject.author = self.currentParsedCharacterData;

}

Когда я получаю NSLog "self.currentPhotoObject.titleText" и из "self.currentPhotoObject.author" здесь, оба дают мне автора.В третьем разобранном методе это то же самое.Все три свойства (titleText, author и locationText) являются locationText.

Я понятия не имею, почему .titleText например изменяется, когда парсер устанавливает .author.

Я дважды проверил все, по крайней мере, 10раз и сравнил его с образцом SeismicXML, но я не могу найти проблему.Пожалуйста, помогите мне.Я благодарен за каждую подсказку!

Привет, Себастьян

ps: Мои свойства в файле .m:

@interface ParseOperation () <NSXMLParserDelegate>
@property (nonatomic, retain) Photo *currentPhotoObject;
@property (nonatomic, retain) NSMutableArray *currentParseBatch;
@property (nonatomic, retain) NSMutableString *currentParsedCharacterData;
@end

@implementation ParseOperation

@synthesize photoData, currentPhotoObject, currentParsedCharacterData, currentParseBatch;

1 Ответ

1 голос
/ 13 марта 2011

Это потому, что вы присваиваете один и тот же NSMutableString экземпляр всем этим свойствам.

1) Объявите свойства author, titleText, locationText как copy, чтобы избежать этого в будущем.

2) Делайте копию каждый раз, когда вы хотите вернуть значение NSMutableString или присвоить его чему-либо

self.currentPhotoObject.titleText = [[self.currentParsedCharacterData copy] autorelease];
...